iPhone — наследование UIImagePickerControllerDelegate

Я добавил UIImagePickerController к UIViewController. Я также назначил UIImagePickerControllerDelegate этому UIViewController.

Когда я выполняю следующую строку,

myPicker.delegate = self;

Xcode дарит мне следующее сообщение:

предупреждение: присвоение идентификатора из несовместимого типа «RootViewController»

Затем я добавил протокол UINavigationControllerDelegate к тому же UIViewController, и сообщение об ошибке исчезло.

Итак, нужно ли добавлять оба протокола в UIViewController, когда я добавляю UIImagePickerController?

Если UIImagePickerController является подклассом UINavigationController, как указано в документах, разве это не должно быть автоматически? Почему я должен добавлять протокол делегата его родителя, а не только протокол UIImagePickerControllerDelegate?

Это ошибка или я что-то упускаю?




Ответы (2)


Как вы заметили, UIImagePickerController наследуется от UINavigationController. Однако он использует одно и то же свойство delegate и не объявляет (гипотетический) собственный "imagePickerDelegate", поэтому ваш делегат должен соответствовать обоим протоколам. Это имеет смысл, потому что вы также назначаете того же делегата для части UINavigationController (которая ничего не знает о средстве выбора изображений).

На мой взгляд, дизайн API здесь немного сомнителен, но в любом случае все методы в UINavigationControllerDelegate являются необязательными, поэтому достаточно объявить, что вы соответствуете протоколу, и покончить с этим.

person omz    schedule 18.01.2011
comment
это нелогично и противоречит здравому смыслу, а документы, как всегда, чертовски расплывчаты, но я подозревал, что проблема была в чем-то подобном. В любом случае, спасибо! - person Duck; 18.01.2011

Добавьте этот код, как показано ниже, и вы увидите, что предупреждение исчезло.

@interface viewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> { }
@end

Протокол UIImagePickerController и UINavigationController должен быть добавлен в ваш интерфейс, это может сделать предупреждение невидимым.

person qucooln    schedule 11.06.2012
comment
Спасибо, мне очень помогло и быстро решил проблему - person Rinku; 17.09.2015