Я ищу хороший пример кода для использования делегата и событий в цели c? я знаком с делегатом и событиями в 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. Фактически, вся страница имеет отношение к обеим частям вашего вопроса, поэтому я очень рекомендую ее.