вызов дополнительных методов делегата - PullRequest
12 голосов
/ 23 ноября 2010

я создал делегат для класса

@protocol gameDelegate <NSObject>
@optional
-(void)gameStarted;
@required
@end

, теперь в моем игровом объекте я вызвал этот метод:

[self.delegate gameStarted];

так что теперь, если я инициирую этот объект где-нибудь и установлюделегат все работает нормально, пока не будет вызван gameStated, потому что он не реализован в основном объекте, где создается игровой объект (потому что он необязательный).

я пробовал некоторые варианты этого

if(![self.delegate respondsToSelector: @selector(gameStarted)]) {
    //[self.delegate gameStarted];
}

но это не работает для меня.какие-нибудь идеи, как сделать это "действительно" дополнительным?

заранее спасибо

Ответы [ 3 ]

18 голосов
/ 23 ноября 2010

Пропустите отрицание из вашего if заявления:

if ([self.delegate respondsToSelector:@selector(gameStarted)]) {
    ...
}
1 голос
/ 24 февраля 2016

Для быстрого выполнения этого я рекомендую следующее:

@objc protocol MyDelegate {

optional func optionalMethod()

}

class MyClass : MyDelegate {

// optionalMethod() does not have to be declared

}

Затем, чтобы вызвать optional для вашего delegate объекта, просто используйте if delegate.optionalMethod?(){}

0 голосов
/ 11 февраля 2014

Проверка, реализует ли делегат необязательный метод, а затем его вызов - настолько распространенный шаблон, что я использую макрос препроцессора SAFE_CALL, который проверяет respondToSelector: и затем вызывает метод.

Макрос:

#define SAFE_CALL(obj,method) \
([obj respondsToSelector:@selector(method)] ? [obj method] : nil)

и используется так:

SAFE_CALL(sourceDelegate, refresh)
// or 
NSString *response = SAFE_CALL(object, responseValue)

Обратите внимание, что эта версия работает только с методами без параметров.

Первоначально это было реализовано как функция C, но это вызывает предупреждения с утечками performSelector при использовании ARC. В качестве макроса препроцессора он работает точно так, как ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...