Как запрограммирован метод addTarget:action:forControlEvents?

#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 это общий принцип. Конечно, есть способы сделать его более эффективным (используя таблицы поиска и т.д.). Но оптимизация производительности необходима только после того, как вы определили, что производительность является проблемой.