цель c - делегат и события - PullRequest
16 голосов
/ 06 июня 2010

Я ищу хороший пример кода для использования делегата и событий в цели c?я знаком с делегатом и событиями в C #.

, поэтому, если кто-то может помочь мне с несколькими строками кода, это будет очень полезно.

Ответы [ 2 ]

22 голосов
/ 07 июня 2010

Селекторы (эквивалент делегатов C #)

Осторожно, в C # есть термин «делегат», а в Objective-C - «делегат», но у этих двух нет ничего общего.

"Делегат" в C #, по сути, является указателем на типобезопасную функцию.Эквивалент указателя на функцию в Objective-C называется «селектором».

Чтобы объявить параметр, переменную-член или локальную переменную в качестве селектора, объявите тип как SEL.Например, в файле заголовка для класса NSTimer вы можете найти этот метод:

- (id)initWithFireDate:(NSDate *)date
              interval:(NSTimeInterval)seconds
                target:(id)target
              selector:(SEL)aSelector
              userInfo:(id)userInfo
               repeats:(BOOL)repeats;

Это означает, что вы должны передать селектор в качестве четвертого аргумента при использовании этого метода.Вы можете назвать это так:

[[NSTimer alloc] initWithFireDate: someDate
                         interval: someInterval
                           target: self
                         selector: @selector(myTimerCallback:)
                         userInfo: nil
                          repeats: NO];

Как видите, написав @selector(some-name-here), я могу создать новый селектор (аналогично тому, как я могу создать новую строку, написав @"some text here").Методы Objective-C имеют «дыры» в них, где вставляются аргументы, и этим дырам предшествует двоеточие.При написании селектора, как указано выше, вы сохраняете двоеточия, но удаляете все остальное.Например, вы можете написать что-то вроде @selector(firstPart:secondPart:thirdPart:).

Документация о методе, который принимает селектор, должна обычно указывать, какую подпись ему разрешено иметь.Компилятор НЕ будет применять это для вас (это очень отличается от делегатов C #).

Обратите внимание также на то, что приведенный выше метод запрашивает параметр "target".Обычно это объект, к которому будет вызываться селектор.Обратите внимание, что цель является полностью нетипизированной id.Компилятор не пытается обеспечить, чтобы объект, который вы передаете в качестве цели, действительно отвечал методу, указанному селектором.Если он не отвечает, то это ошибка времени выполнения.Это является частью динамической природы Objective-C.

(Концепция «делегата» в Objective-C на самом деле является просто шаблоном делегата (ищите его), который очень распространен в Objective-C, часто используемомгде другие языки будут использовать наследование.)

События и действия

Что касается событий, существует класс NSEvent , но у меня еще не было никакого опыта с ним.Похоже, что для довольно низкого уровня обработки событий GUI.Использование C # для событий, вероятно, больше похоже на «действия» в Objective-C.

Как правило, компонент GUI такой кнопки имеет «действие» и «цель», связанные с ним.Вы можете установить их либо в коде, либо в Интерфейсном Разработчике.Цель, как описано выше, - объект, для которого будет вызван метод.А «действие» на самом деле является просто селектором.

Пожалуйста, прочтите раздел «Механизм целевого действия» этой статьи «Основы какао» в документации Apple.На самом деле вся эта страница относится к обеим частям вашего вопроса, поэтому я настоятельно рекомендую ее.

1 голос
/ 14 августа 2012

Ответ выше, безусловно, правильный. Однако, если вы ищете способ реализовать шаблон издателя / подписчика, вам следует проверить NSNotificationCenter. Это сообщение имеет хороший пример.

...