#iphone #objective-c #cocoa-touch #ios #delegates
#iPhone #objective-c #cocoa-touch #iOS #делегирует
Вопрос:
Я использую внешнюю библиотеку, и один из моих контроллеров представления регистрируется в качестве делегата для класса в этой среде. Теперь в одном месте я хочу выполнить некоторый код для этого класса делегата. Я пишу метод для этого и вызываю его в своем делегате.
Теперь все работает нормально, но я получаю предупреждение о том, что этот недавно добавленный метод не является частью протокола.
Это мой класс:
@protocol MyExtendedDelegate <LibraryDelegate>
@optional
- (void)actionTaken;
@end
@interface MyController : UITableController <MyExtendedDelegate> {
}
@end
И внутри моего контроллера я регистрирую себя в качестве делегата для библиотечного контроллера
LibraryController *libController = [[LibraryController alloc] init];
libController.delegate = self;
Наконец, это код в отдельном классе, где я вызываю этот метод:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if ([self.libraryController.delegate respondsToSelector:@selector(actionTaken)]) {
[self.libraryController.delegate actionTaken];
}
Вот предупреждение, которое я получаю:
— Принятое действие не найдено в протоколе
— NSObject может не реагировать на принятое действие
Я хочу избавиться от этого предупреждения. Есть идея.
Ответ №1:
Свойство libraryController.delegate
определено во внешней библиотеке в соответствии с LibraryDelegate
. Попробуйте понизить значение до MyExtendedDelegate
перед вызовом метода из вашего расширенного протокола.
if ([self.libraryController.delegate conformsToProtocol:@protocol(MyExtendedDelegate)])
{
id<MyExtendedDelegate> extendedDelegate = (id<MyExtendedDelegate>)self.libraryController.delegate;
if ([extendedDelegate respondsToSelector:@selector(actionTaken)])
{
[extendedDelegate actionTaken];
}
}
Ответ №2:
Напишите новый протокол, который расширяет старый, и соответствуйте ему, что-то вроде:
@protocol MyNewProtocol <OtherProtocol>
- (void) myCoolMethod;
@end
Комментарии:
1. Я сделал это, но предупреждение все еще приходит.
2. И вы объявляете поддержку MyNewProtocol вместо OtherProtocol, а также импортируете файл заголовка, в котором объявляется OtherProtocol?
Ответ №3:
- (недействительно)AlertView:(UIAlertView *)AlertView clickedButtonAtIndex:(NSInteger)buttonIndex { if ([self.libraryController.delegate respondsToSelector:@selector (actionTaken)]) { [self.libraryController.delegate performSelector:@selector (actionTaken)]; }
Использование performSelector вместо прямого вызова метода наверняка удалит предупреждение.