티스토리 뷰

반응형

 

안녕하세요 :) 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에서는 예전처럼 나오네요.

 

참고 : 

stackoverflow.com/questions/54988309/uiimagepickercontroller-and-uinavigationcontrollerdelegate-implementation

반응형