Установка делегата в подклассе, когда есть два возможных делегата в родительских классах - PullRequest
0 голосов
/ 14 августа 2010

Я получаю предупреждение, когда устанавливаю делегата для UIImagePickerController.Это потому, что UIImagePickerController и его родительский UINavigationController имеют делегатов, которые могут быть использованы.Код работает нормально, но просто удивляется, как правильно обрабатывать делегаты и наследование и теряет предупреждение.

Так что в основном я создал свой собственный MyImagePickerController, который является подклассом UIImagePickerController.UIImagePickerController является подклассом UINavigationController.таким образом, дерево наследования

UINavigationController > UIImagePickerController > MyImagePickerController

MyImagePickerController также является делегатом для UIImagePickerController.Поэтому я добавляю к своему @ interface.

@interface MyImagePickerController : UIImagePickerController <UIImagePickerControllerDelegate>...

Затем я устанавливаю MyImagePickerController в качестве делегата себе в loadView

- (void) loadView
{
...
self.delegate = self;
...

} И я реализую методы делегата UIImagePickerControllerDelegate, и все это работает.

Но я получаю предупреждение

warning: class 'MyImagePickerController' does not implement the 'UINavigationControllerDelegate' protocol

Проблема в том, что оба родительских класса имеют своих собственных Делегатов

UINavigationController         > UIImagePickerController         > MyImagePickerController
UINavigationControllerDelegate > UIImagePickerControllerDelegate > MyImagePickerController

И в определении для UIImagePickerController метод делегатаможет принимать либо UINavigationControllerDelegate или UIImagePickerControllerDelegate

@interface UIImagePickerController : UINavigationController <NSCoding> {
@property(nonatomic,assign)    id <UINavigationControllerDelegate, UIImagePickerControllerDelegate> delegate;

приложение работает, методы UIImagePickerControllerDelegate в MyImagePickerController в настоящее время называется, но есть правильный способ установить делегат, так кто-то читает код знает, что мы пытаемся реализовать UIImagePickerControllerDelegateметоды и для новичка, чтобы очистить предупреждение.

А что произойдет, если вы хотите реализовать оба метода UIImagePickerControllerDelegate и UINavigationControllerDelegate в UIImagePickerControllerDelegate?Как бы вы установили единого делегата в Obj-C?Приветствия

1 Ответ

1 голос
/ 14 августа 2010

Прочитайте предупреждение.Он сообщает вам все, что вам нужно знать.

предупреждение: класс 'MyImagePickerController' не реализует протокол 'UINavigationControllerDelegate'

Эта строка:

@property(nonatomic,assign) id <UINavigationControllerDelegate, UIImagePickerControllerDelegate> delegate;

Не означает, что объект делегата (объект делегата Note, а не метод делегата) может быть UINavigationControllerDelegate или UIImagePickerControllerDelegate.Это означает, что объект делегата должен быть UINavigationControllerDelegate и UIImagePickerControllerDelegate (он должен соответствовать обоим этим протоколам).

Вы, кажется, немного смущены подклассами инаследование.Проблема не в том, что оба родительских класса имеют своих собственных делегатов.UINavigationController имеет свойство делегата UINavigationControllerDelegate, и поскольку UIImagePickerController является UINavigationController, у него также есть этот делегат, который все еще является UINavigationControllerDelegate, но он также имеет добавленное дополнительное поведение, как это делают подклассыи теперь делегат должен не только реализовывать методы UINavigationControllerDelegate , но также UIImagePickerControllerDelegate методы.

Так что проблема не в том, что происходит, если вы хотите реализовать оба.. ".Вы должны реализовать оба.

...