Предупреждение при добавлении и использовании нового метода во внешнем библиотечном протоколе

#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 вместо прямого вызова метода наверняка удалит предупреждение.