我必须遗漏一些明显的东西,但......
UIControl有一个方法
- (void)addTarget:(id)target action:(SEL)action forControlEvents: (UIControlEvents)controlEvents
允许您添加要在任何给定的controlEvent发生时调用的操作。 ControlEvents是一个事件的位掩码,它告诉你触摸是否发生了变化,或者是内部触摸,还是被拖动等等,其中大约有16个,你或他们在一起并在任何一个发生时被调用。
选择器可以具有以下签名之一
- (void)action
- (void)action:(id)sender
- (void)action:(id)sender forEvent:(UIEvent *)
这些都没有告诉你控件事件位掩码是什么。 UIEvent略有不同,它与实际的触摸事件有关,而且(我认为)不包含UIControlEvent。发件人(UIControl)也无法找到控件事件。
我想有一个处理大量控制事件的方法,因为我有一些常见代码,无论发生了哪些事件或事件,但我仍然需要知道UIControlEvents用于某些特定处理。
我错过了一种方法来查明在调用操作时使用了什么UIControlEvents,或者我是否真的必须将我的代码分成
-(void)actionWithUIControlEventX;
-(void)actionWithUIControlEventY;
答案 0 :(得分:5)
我遇到了同样的问题,并想出了一个解决方案。它不是很漂亮,但它的效果非常好。它是一个UIControl类别,它将最后一个UIControlEvent存储到它自己的标记属性中。您可以从以下链接获取。如需进一步参考,请参阅我的类别中的文档,以获取有关正在进行的更详细的描述。
希望这有帮助!干杯/ J
git gist at:http://gist.github.com/513796
问题:在触发时,UIControlEvents不会传递到目标操作中 分配给特定事件。这对于只有 一个基于UIControlEvent触发的动作。
解决方案:添加一种方法来存储在UIEvent中触发的UIControlEvent。
问题:但我们无法覆盖私有API,因此: (WORSE)解决方案:让UIControl存储上次触发的UIControlEvent。
UIControl文档声明:
当用户以对应于一个或多个的方式触摸控件时 指定的事件,UIControl发送自己的sendActionsForControlEvents:。 这导致UIControl将动作发送到UIApplication中 sendAction:to:from:forEvent:message。
有人会认为sendActionsForControlEvents:可以被覆盖(或者 子类)存储标志,但事实并非如此。看起来 sendActionsForControlEvents:主要用于客户端触发事件 编程。
相反,我必须建立一个为每个控件注册一个动作的方案 想跟踪的事件。我决定不跟踪所有事件(或在 所有UIControls的性能和易用性。
在UIControl设置上:
UIControlEvents capture = UIControlEventTouchDown;
capture |= UIControlEventTouchDown;
capture |= UIControlEventTouchUpInside;
capture |= UIControlEventTouchUpOutside;
[myControl captureEvents:capture];
[myControl addTarget:self action:@selector(touch:) forControlEvents:capture];
目标行动:
- (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;
}
答案 1 :(得分:0)
创建UIControl时,请为tag属性设置一个值。然后在您的操作函数中,您可以使用[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;
}
}