Селекторы (эквивалент делегатов 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.На самом деле вся эта страница относится к обеим частям вашего вопроса, поэтому я настоятельно рекомендую ее.