티스토리 뷰
왜 UIImagePickerControllerDelegate와 UINavigationControllerDelegate를 같이 써줘야할까?
Zedd0202 2020. 12. 15. 21:24
안녕하세요 :) Zedd입니다.
때는 2020년 12월 15일..
~ 3년전의 제드 ~
iOS ) 내 사진앨범/카메라에서 이미지 가져오기 공부를 하게되는데..
하지만 그 때...!!!
extension ViewController : UIImagePickerControllerDelegate, UINavigationControllerDelegate {
}
UIImagePickerControllerDelegate와
UINavigationControllerDelegate를 같이써야 한다는 사실을 알게되는데..
근데 갑자기 무슨 UINavigationControllerDelegate?
이건 왜해준걸까요?
저도 궁금해서 찾아봤는데, 저랑 똑같은 궁금증을 가지신 분이 계시더라구요.
여기에 가시면, 질문과 답변을 영어로 볼 수 있습니다 ^^..
Q : UIImagePickerControllerDelegate를 선언 할 때 UINavigationControllerDelegate를 선언해야하는 이유를 분명히 알 수 있을까?
A : 정확하게 번역을 못하겠어서, 여기저기서 찾은것을 종합했어요 ㅠㅠ
UIImagePickerControllerDelegate의 delegate 속성은 UIImagePickerControllerDelegate와 UINavigationControllerDelegate 프로토콜을 모두 구현하는 객체로 정의되어있다.
(위에서 해준 picker.delegate = self) self를 picker.delegate에 할당하려면 self는 UINavigationControllerDelegate 타입이어야 한다.
지금, picker의 델리게이트를 UINavigationControllerDelegate에 위임해준 것인데, 대리자는 사용자가 이미지나 동영상을 선택하거나 picker화면을 종료할 때, 알림을 받는다.
조금 아시겠나요?ㅎㅎ
저도 더 공부해야할 것 같습니다....ㅎㅎ
이렇게 삐걱거리며 끝나게 되는데..
사실 위에서 말한 답변...진짜 저게 다거든요!? 근데 가독성 거의 뭐 개쌉오바수준이라
좀 더 자세하게 살펴보려고 합니다.
재미로 쓰는 글이니 참고용으로만 봐주세요.
UIImagePickerController 사용하실 때
이렇게 사용하실텐데요,
delegate 정의를 보겠습니다.
Protocol Composition입니다.
delegate에는
UIImagePickerControllerDelegate와
UINavigationControllerDelegate를 동시에 만족하는 타입만 넣을 수 있습니다.
그래서 delegate = self를 하려면,
이렇게 해줘야하는 것이죠.
근데..
delegate는 UIImagePickerController에 있는 프로퍼티잖아요?
그럼 UIImagePickerControllerDelegate만 준수하는 타입이 들어가도 될 것 같은데 왜 UINavigationControllerDelegate도 준수하도록 요구했을까요?
UIImagePickercontroller는 UINavigationController를 상속받고 있습니다.
그리고 모든 UI를 시스템에서 제공합니다.
저 Cancel을 제가 만들어준거 아니잖아요??
근데도 cancel을 누르면 Picker가 잘 닫힙니다.
UIImagePickerControllerDelegate의 imagePickerControllerDidCancel메소드를 따로 구현안해줘도 말이죠.
이런 이벤트들을 위해 UINavigationController와 통신해야하는 것입니다!
UINavigationControllerDelegate의 메소드는 전부 optional이라 구현은 안해도 되지만..
굳이 구현해보면 이렇게 될 것 같아요. (이거말고 메소드 많아요!)
아무튼 이러한 이유때문에
UIImagePickerControllerDelegate, UINavigationControllerDelegate를 둘 다 conform해야한다는거..!!!
Q : PHPickerViewController는?
A :
이런식으로 사용하는데요, delegate는 과연 무슨타입일지..!!
PHPickerViewControllerDelegate만 준수하면 됩니다.
즉,
이걸로도 충분하다는 소리죠!
(PHPickerViewController입니다.)
왜 이 친구는 UINavigationControllerDelegate를 준수 안해도 될까요!?
이 친구는 UIImagePickercontroller와 다르게 UIViewController를 상속받고 있어서 그런게 아닐까 추측하는 부분입니다.
(UIImagePickercontroller는 UINavigationController를 상속받고 있었음)
끝!
글에 틀린점이 있다면 댓글로 알려주세요!
+ 오늘 한가지 알았어요!
iOS 14이상에서
PHPickerConfiguration에 아무것도 안바꾸고 그냥 넣으면. UIImagePickerController랑 UI가 완전히 똑같아요!
좌 : PHPickerViewController / 우 : UIImagePickerController
하지만
좌 : iOS 13.x UIImagePickerController / 우 : iOS 14.x UIImagePickerController
iOS 13.x에서는 예전처럼 나오네요.
참고 :
'공부' 카테고리의 다른 글
Github Projects 사용해보기 (2) (0) | 2021.01.04 |
---|---|
Github Projects 사용해보기 (1) (1) | 2021.01.04 |
LLVM이란 (2) | 2020.12.03 |
Code Coverage (2) | 2020.10.07 |
⚠️ Compiler Protocol Init Violation: The initializers declared in compiler protocol ExpressibleByArrayLiteral shouldn't be called directly. (0) | 2020.10.06 |
- fastlane
- np-complete
- swift tutorial
- np-hard
- Xcode
- 스위프트
- swift sort
- Git
- WKWebView
- IOS
- Combine
- swift 공부
- Accessibility
- 제이슨 파싱
- SwiftUI
- actor
- swift array
- swift delegate
- swift3
- WidgetKit
- ios 13
- github
- 회고
- Swift
- FLUTTER
- UIBezierPath
- iOS delegate
- 피아노
- 스위프트 문법
- WWDC
- Total
- Today
- Yesterday