【问题标题】:How to pass multiple values into @selector( ) for a UIButton?如何将多个值传递给 UIButton 的 @selector()?
【发布时间】:2012-06-20 23:28:47
【问题描述】:
也就是说:我有一个按钮有两个事件,如何在回调函数setRedPos中捕获UIControlEventTouchDown和UIControlEventTouchUpInside?
[btnRedPos addTarget:self action:@selector(setRedPos:) forControlEvents:UIControlEventTouchDown];// I want to pass in a value of 0
[btnRedPos addTarget:self action:@selector(setRedPos:) forControlEvents:UIControlEventTouchUpInside];// I want to pass in a value of 1
...
- (void) setRedPos:(UIButton*)btn
{
}
【问题讨论】:
标签:
objective-c
cocoa-touch
【解决方案1】:
您不能通过目标/动作传递任意参数。第一个参数是发送者,第二个(如果你这样设置的话)是事件。您可以使用事件来判断触发它的事件类型,如下所示:
[btnRedPos addTarget:self action:@selector(setRedPos:forEvent:)
forControlEvents:UIControlEventTouchDown];
[btnRedPos addTarget:self action:@selector(setRedPos:forEvent:)
forControlEvents:UIControlEventTouchUpInside];
- (void) setRedPos:(id)sender forEvent:(UIEvent*)event
{
UITouch* aTouch = [[event allTouches] anyObject];
if( aTouch.phase == UITouchPhaseBegan ) {
NSLog( @"touch began" );
}
else if( aTouch.phase == UITouchPhaseEnded ) {
NSLog( @"touch ended" );
}
}
【解决方案2】:
使用两个单独的选择器。
- (void)setRedPosDown:(UIButton *)button {
[self setRedPos:button state:0];
}
- (void)setRedPosUp:(UIButton *)button {
[self setRedPos:button state:1];
}
[btnRedPos addTarget:self action:@selector(setRedPosDown:) forControlEvents:UIControlEventTouchDown];
[btnRedPos addTarget:self action:@selector(setRedPosUp:) forControlEvents:UIControlEventTouchUpInside];
【解决方案3】:
我知道在一种方法中实现这一目标的唯一两种方法是:
1) zpasternack 描述的方法
2)使用两个单独的按钮,一个用于触摸,一个用于触摸并测试发送者。
第一种方法在您的情况下更好,因为它只有一个按钮对象。
如果您正在寻找一种方法来实现不同按钮的操作,则第二种方法会很有用。
尽量贴近物理表示。一个按钮,两个不同的动作?该代码只有一个按钮并测试操作。