Присвоение «id‹UINavigationControllerDelegate,UIImagePickerControllerDelegate›» из несовместимого типа «ViewController *const__strong»

У меня есть ImagePickerController в моем приложении. Работает хорошо, но рядом с ipc.delegate = self; появляется сообщение об ошибке:

Присвоение «id» из несовместимого типа «ViewController * const__strong»

Приложение работает хорошо, поэтому я проигнорировал сообщение об ошибке, но думаю, мне нужно знать почему. Почему появляется сообщение об ошибке?

ipc = [[UIImagePickerController alloc]init];
            ipc.modalPresentationStyle = UIModalPresentationCurrentContext;
            ipc.delegate = self;
            ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
            [ipc setAllowsEditing:NO];
            [self presentViewController:ipc animated:NO completion:nil];

person 홍승욱    schedule 17.10.2014    source источник


Ответы (2)


Если вы посмотрите на определение свойства делегата UIImagePickerController, вы увидите, что оно определено как:

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

Какой бы объект вы ни установили в качестве делегата (в данном случае вы используете self), он должен соответствовать как протоколу UINavigationControllerDelegate, так и протоколу UIImagePickerControllerDelegate. Если объект не соответствует обоим этим протоколам, вы получите предупреждение во время компиляции.

Вот как вы объявляете, что ваш класс соответствует протоколам:

@interface MyViewController : UIViewController <UINavigationControllerDelegate, 
                                                UIImagePickerControllerDelegate>

Прочитайте работу с протоколами, UINavigationControllerDelegate и UIImagePickerControllerDelegate.

person memmons    schedule 17.10.2014
comment
Я уже добавил их в файл ViewController.h. Вот почему я понятия не имею, почему появляется ошибка. - person 홍승욱; 18.10.2014
comment
@홍승욱 Убедитесь, что вы заявляете, что ваш класс соответствует протоколу. @interface MyViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate> - person memmons; 18.10.2014

Я просто впервые столкнулся с этим. Если ваш класс расширяет другой класс, который соответствует другим протоколам, и ваш класс также соответствует этим двум протоколам <UINavigationControllerDelegate, UIImagePickerControllerDelegate>, то для удаления предупреждения вы должны привести его, например:

ipc.delegate = (id<<UINavigationControllerDelegate, UIImagePickerControllerDelegate>) self;

Лично я думаю, что это ошибка в компиляторе, поскольку вы придерживаетесь обоих протоколов, просто вы также придерживаетесь других. Таким образом, вы не должны видеть предупреждение.

person Armand    schedule 14.04.2017