2014-12-11 5 views
3

Как я могу получить класс моего делегата? Я хотел бы назвать что-то вроде self.delegate.class, но его не существует.iOS - как получить класс делегата

Моя цель - вызывать 2 разных метода, в зависимости от того, какой класс был тем, кто инициировал класс, у которого есть протоколы.

+2

[сам.класс делегата]. class - это селектор, а не свойство. –

+0

@ Kampai Не назначаю ли я определенному классу делегат другого класса? – bobsacameno

+0

@OnikIV не работает для меня. В нем говорится «Не знаю метода экземпляра для класса селектора». – bobsacameno

ответ

1

Вы можете (и должны) использовать replysToSelector, чтобы проверить, может ли этот делегат ответить на этот селектор, а не пытаться выяснить его класс.

Пример:

if ([self.delegate respondsToSelector:@selector(method1:)]) { 
    [self.delegate method1:self]; 
} else if ([self.delegate respondsToSelector:@selector(method2:)]) { 
    [self.delegate method2:self]; 
} 

И вы только реализовать каждый метод в классах, которые вы хотите, но оба они находятся на протоколе делегата. Соответствует ли этот подход вашим потребностям?

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

Более подробная информация о respondsToSelector @Apple Documentation

0

Всего смысл использования протоколов делегата является отвязать объект делает работу с типа класса, который действует на работе.

На самом деле, сам характер делегата состоит в том, что вы не ухаживания какой класс он есть. Все, что вам нужно, это то, что он соответствует протоколу и поэтому будет иметь набор известных функций, которые могут быть запущены на нем.

Делегат может быть UIView, UIViewController, UILabel или любым специальным классом, которым вы хотите быть.

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

Кроме того, класс с делегатом не должен знать, что происходит с данными, и это тоже не должно волновать. Например, UITableView не знает, что происходит, когда его делегат отвечает на выбранную ячейку. Этот делегат может что-то обновить в CoreData или перейти на новый ViewController. В представлении таблицы нет (и не должно) знать это.

Ваш объект должен сказать что-то вроде ... HELLO DELEGATE! Something just happened and this is the result, just wanted to let you know. Затем делегат берет этот результат и действует на него.

-1

Для вашего вопроса: Зов [delegate class]

Теперь у вас есть класс делегата.

Примечание: Если ваш делегат равен нулю, [delegate class] не отвечает.

Примечание2: Установите оператор отладки, чтобы просмотреть класс делегата. Кроме того, вы можете поместить проверку отладочной выписки, чтобы увидеть делегат nil?

Смежные вопросы