Как запрограммирован метод addTarget: action: forControlEvents:? - PullRequest
1 голос
/ 21 мая 2011

В UIKit, UIControl имеет следующие методы:

  • addTarget:action:forControlEvents:
  • removeTarget:action:forControlEvents:

Мне интересно знать, как этозапрограммировано.Может ли кто-нибудь указать на ресурс о том, как программируются эти методы (или привести пример, как они программируются)?

Я реализовал нечто подобное для моего собственного проекта, который работает.Однако было бы здорово узнать, как лучше всего это сделать, или как Apple это реализовала, так как это полезный шаблон.(И, если я прав, отличается от шаблона делегата?).

1 Ответ

6 голосов
/ 21 мая 2011

Все довольно просто.Вот один из способов, как вы могли бы представить, что это работает:

@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 & 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
}

Удаление будетпросто удалить объект пары из соответствующего массива и отправить события просто так:

- (void)sendActionsForControlEvents:(UIControlEvents)controlEvents {
  NSArray *pairs = [self mutableArrayOfTargetActionPairsForControlEvent:controlEvents];
  for (UIControlTargetActionPair *pair in pairs) {
    [[pair target] performSelector:[pair action] withObject:self withObject:theCurrentEvent];
  }
}

Конечно, это не настоящий код.Но имея код здесь передо мной, это общий принцип.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...