目标行动uicontrolevents

Fab*_*lli 13 events action objective-c targets

我必须在这里遗漏一些明显的东西,但......

UIControl有一个方法

- (void)addTarget:(id)target action:(SEL)action forControlEvents: (UIControlEvents)controlEvents
Run Code Online (Sandbox Code Playgroud)

它允许您添加要在任何给定的controlEvent发生时调用的操作.ControlEvents是一个事件的位掩码,它告诉你触摸是否下降,内部,或被拖动等等,其中大约有16个,你或他们在一起,当它们中的任何一个发生时被调用.

选择器可以具有以下签名之一

- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)
Run Code Online (Sandbox Code Playgroud)

这些都没有告诉你控制事件位掩码是什么.UIEvent略有不同,它与实际的触摸事件有关,而且(我认为)不包含UIControlEvent.发送方(UIControl)也无法找到控制事件.

我想有一个处理大量控制事件的方法,因为我有一些共同的代码,无论发生了哪些事件或事件,但我仍然需要知道UIControlEvents用于某些特定处理.

我错过了一种方法来找出在调用操作时使用了什么UIControlEvents,或者我是否真的必须将我的代码分成

-(void)actionWithUIControlEventX;
-(void)actionWithUIControlEventY;
Run Code Online (Sandbox Code Playgroud)

jbe*_*net 5

我遇到了同样的问题,并想出了一个解决方案.它不是很漂亮,但它的效果非常好.它是一个UIControl类别,它将最后一个UIControlEvent存储到它自己的标记属性中.您可以从以下链接获取.如需进一步参考,请参阅我的类别中的文档,以获取有关正在进行的更详细的描述.

希望这有帮助!干杯/ J

UIControl + CaptureUIControlEvents

git gist at:http://gist.github.com/513796

问题:在触发时,UIControlEvents不会传递到分配给特定事件的目标操作.这对于只有一个基于UIControlEvent触发切换的动作很有用.

解决方案:添加一种方法来存储在UIEvent中触发的UIControlEvent.

问题:但是我们不能覆盖私有API,因此:(WORSE)解决方案:让UIControl存储上次触发的UIControlEvent.

UIControl文档指出:

当用户以对应于一个或多个指定事件的方式触摸控件时,UIControl会自行发送sendActionsForControlEvents:.这导致UIControl在sendAction:to:from:forEvent:message中将操作发送到UIApplication.

有人会认为sendActionsForControlEvents:可以被覆盖(或子类)来存储标志,但事实并非如此.似乎sendActionsForControlEvents:主要是客户端以编程方式触发事件.

相反,我必须设置一个方案,为每个想要跟踪的控制事件注册一个动作.我决定不跟踪所有事件(或所有UIControls)的性能和易用性.

用法示例:

在UIControl设置上:

UIControlEvents capture = UIControlEventTouchDown;
capture |= UIControlEventTouchDown;
capture |= UIControlEventTouchUpInside;
capture |= UIControlEventTouchUpOutside;
[myControl captureEvents:capture];
[myControl addTarget:self action:@selector(touch:) forControlEvents:capture];
Run Code Online (Sandbox Code Playgroud)

目标行动:

- (void) touch:(UIControl *)sender {
  UIColor *color = [UIColor clearColor];
  switch (sender.tag) {
    case UIControlEventTouchDown: color = [UIColor redColor]; break;
    case UIControlEventTouchUpInside: color = [UIColor blueColor]; break;
    case UIControlEventTouchUpOutside: color = [UIColor redColor]; break;
  }
  sender.backgroundColor = color;
}
Run Code Online (Sandbox Code Playgroud)


小智 0

创建 UIControl 时,为标记属性设置一个值。然后在您的操作函数中,您可以使用 [sender tag] 确定调用它的 UIControl 的标签。这是一个例子:

-(void)viewDidLoad {
    UIButton *button1 = [[UIButton alloc] initWithFrame(CGRectMake(0.0,0.0,100.0,100.0)];
    button1.tag = 42;
    [button1 addTarget:self action:@selector(actionWithUIControlEvent:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button1];


    UIButton *button2 = [[UIButton alloc] initWithFrame(CGRectMake(100.0,0.0,100.0,100.0)];
    button2.tag = 43;
    [button2 addTarget:self action:@selector(actionWithUIControlEvent:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button2];

}
-(void)actionWithUIControlEvent:(id)sender {
     switch([sender tag]) {
     case 42:
         //Respond to button 1
         break;
     case 43:
         //Respond to button 2
         break;
     default:
         break;
     }
 }
Run Code Online (Sandbox Code Playgroud)