цель c - делегат и события

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

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

16
задан Alex Cio 6 February 2015 в 13:37
поделиться

1 ответ

Селекторы (эквивалент делегатов 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) , я могу создать новый селектор (аналогично тому, как я могу создать новую строку с помощью запись @ "здесь текст" ). В методах Objective-C есть «дыры», куда вставляются аргументы, и этим дырам предшествуют двоеточия. При написании селектора, как указано выше, вы сохраняете двоеточия, но удаляете все остальное. Например, вы можете написать что-то вроде @selector (firstPart: secondPart: thirdPart:) .

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

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

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

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

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

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

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

22
ответ дан 30 November 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: