1

换句话说:我有一个带有两个事件的按钮,如何捕获UIControlEventTouchDownUIControlEventTouchUpInside在回调函数中setRedPos

[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
{

}
4

3 回答 3

4

您不能通过目标/动作传递任意参数。第一个参数是发送者,第二个(如果你这样设置的话)是事件。您可以使用该事件来判断触发它的事件类型,如下所示:

[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" );
    }
}
于 2012-06-21T02:04:14.223 回答
1

使用两个单独的选择器。

- (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];
于 2012-06-20T23:33:36.030 回答
0

我知道在一种方法中实现这一点的唯一两种方法是:1)zpasternack 描述的方法 2)使用两个单独的按钮,一个用于触摸,一个用于触摸并测试发送者。

第一种方法在您的情况下更好,因为它只有一个按钮对象。如果您正在寻找一种方法来实现不同按钮的操作,则第二种方法会很有用。

尽量贴近物理表示。一个按钮,两个不同的动作?该代码只有一个按钮并测试操作。

于 2012-06-21T08:35:22.707 回答