#objective-c #cocoa-touch #uikit
#objective-c #cocoa-touch #uikit
Вопрос:
В UIKit UIControl имеет следующие методы:
addTarget:action:forControlEvents:
removeTarget:action:forControlEvents:
Мне интересно знать, как они запрограммированы. Может ли кто-нибудь указать на ресурс о том, как программируются эти методы (или привести пример, как они программируются)?
Я реализовал нечто подобное для своего собственного проекта, который работает. Однако было бы здорово узнать наилучший метод для этого, или как Apple его реализовала, поскольку это полезный шаблон. (И, если я прав, отличается от шаблона делегирования?).
Комментарии:
1. @cs — Ой, я действительно неправильно истолковал вопрос. Удалил мой ответ 🙂
Ответ №1:
Это довольно просто. Вот один из способов, которым вы могли бы представить, как это работает:
@interface UIControlTargetActionPair
@property (nonatomic, assign) id target;
@property (nonatomic, assign) SEL action
@end
(с @implementation
, чтобы просто синтезировать эти свойства)
Затем:
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)events {
if (events amp; UIControlEventTouchDown) {
UIControlTargetActionPair *pair = [[UIControlTargetActionPair alloc] init];
[pair setTarget:target];
[pair setAction:action];
[[self mutableArrayOfTargetActionPairsForControlEvent:UIControlEventTouchDown] addObject:pair];
[pair release];
}
else if (....) {
...
}
// repeat for all relevant control events
}
Удаление состояло бы в том, чтобы просто удалить объект pair из соответствующего массива, а отправка событий была бы просто чем-то вроде этого:
- (void)sendActionsForControlEvents:(UIControlEvents)controlEvents {
NSArray *pairs = [self mutableArrayOfTargetActionPairsForControlEvent:controlEvents];
for (UIControlTargetActionPair *pair in pairs) {
[[pair target] performSelector:[pair action] withObject:self withObject:theCurrentEvent];
}
}
Конечно, это не фактический код. Но, имея код здесь передо мной, это общий принцип. 🙂
Комментарии:
1. Как реализован removeTarget:action:forControlEvents:? Перечисляет ли он все эти targetactionpairs, чтобы проверить, соответствуют ли они требованиям, или есть более эффективный способ?
2. @icant это общий принцип. Конечно, есть способы сделать его более эффективным (используя таблицы поиска и т.д.). Но оптимизация производительности необходима только после того, как вы определили, что производительность является проблемой.