方法addTarget如何:action:forControlEvents:编程?

Ros*_*oss 1 cocoa-touch objective-c uikit

在UIKit中,UIControl具有以下方法:

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

我很想知道这些是如何编程的.有人可以指出如何编程这些方法的资源(或提供一个如何编程这些方法的例子)?

我已经为我自己的项目实现了类似的工作.然而,知道最好的技术,或Apple如何实现它将是很好的,因为它是一个有用的模式.(而且,如果我是正确的,与委托模式不同?).

Dav*_*ong 6

这很简单.这是你可以想象它的一种工作方式:

@interface UIControlTargetActionPair
@property (nonatomic, assign) id target;
@property (nonatomic, assign) SEL action
@end
Run Code Online (Sandbox Code Playgroud)

(@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
}
Run Code Online (Sandbox Code Playgroud)

删除将只是从适当的数组远程对对象,发送事件将是这样的:

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

当然,这不是实际的代码.但是把代码放在我面前,这是一般原则.:)