在IPhone中的选择器中传递参数

在IPhone中的选择器中传递参数,iphone,uiview,selector,uibarbuttonitem,Iphone,Uiview,Selector,Uibarbuttonitem,我有一个barButtonItem,它调用一个动作,在一个动画块中交换两个视图。我在它调用的action方法的开头禁用了barButtonItem,我希望在它完成时启用它,这样用户就不能在视图完成翻转之前再次翻转视图 它在UIView动画块中执行此操作,因此如果我在方法的ned处启用它,它将是即时的,这会破坏目的,因为它在动画完成之前启用 在该方法中,我将发送者强制转换为UIBarButtonItem,并禁用它。因此我找到了[UIView setAnimationDidStopSelector:

我有一个barButtonItem,它调用一个动作,在一个动画块中交换两个视图。我在它调用的action方法的开头禁用了
barButtonItem
,我希望在它完成时启用它,这样用户就不能在视图完成翻转之前再次翻转视图

它在UIView动画块中执行此操作,因此如果我在方法的ned处启用它,它将是即时的,这会破坏目的,因为它在动画完成之前启用

在该方法中,我将发送者强制转换为UIBarButtonItem,并禁用它。因此我找到了
[UIView setAnimationDidStopSelector:@selector()]
,但我需要在选择器中传递我的barButtonItem,以便enableControl方法可以启用它(如果我可以创建一个匿名函数,这将非常容易)

那么我怎样才能把这个按钮作为参数传递呢?我不想只为这个做ivar。。代码如下:

- (void)barBtnItemSwitchViews_Clicked:(id)sender {
    UIBarButtonItem *barButton = (UIBarButtonItem *)sender;
    barButton.enabled = NO;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.8];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    if(!self.yellowVC.view.superview) {
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:innerView cache:YES];
        [yellowVC viewWillAppear:YES];
        [blueVC viewWillDisappear:YES];
        [blueVC.view removeFromSuperview];
        self.blueVC = nil;
        [innerView addSubview:yellowVC.view];
    } else if(!self.blueVC.view.superview) {
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:innerView cache:YES];
        [blueVC viewWillAppear:YES];
        [yellowVC viewWillDisappear:YES];
        [yellowVC.view removeFromSuperview];
        self.yellowVC = nil;
        [innerView addSubview:blueVC.view];
    }
    [UIView commitAnimations];
    [UIView setAnimationDidStopSelector:@selector(enableControl:)]; // How do I pass barButton??
}

- (void)enableControl:(UIControl *)control {
    control.enabled = YES;
}

下面是我将其更改为的内容,但是没有调用该方法。。我做错了什么

- (void)barBtnItemSwitchViews_Clicked:(id)sender {
    UIBarButtonItem *barButton = (UIBarButtonItem *)sender;
    barButton.enabled = NO;
    [UIView beginAnimations:nil context:barButton];
    [UIView setAnimationDuration:0.8];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    if(!self.yellowVC.view.superview) {
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:innerView cache:YES];
        [yellowVC viewWillAppear:YES];
        [blueVC viewWillDisappear:YES];
        [blueVC.view removeFromSuperview];
        self.blueVC = nil;
        [innerView addSubview:yellowVC.view];
    } else if(!self.blueVC.view.superview) {
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:innerView cache:YES];
        [blueVC viewWillAppear:YES];
        [yellowVC viewWillDisappear:YES];
        [yellowVC.view removeFromSuperview];
        self.yellowVC = nil;
        [innerView addSubview:blueVC.view];
    }
    [UIView setAnimationDidStopSelector:@selector(flipViewAnimationDidStop:finished:context:)];
    [UIView commitAnimations];
}

- (void)flipViewAnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    UIBarButtonItem *barButton = (UIBarButtonItem *)context;
    barButton.enabled = NO;
    NSLog(@"Disabled");
}


编辑:我想出来了。我必须将按钮设置为上下文,然后执行
setAnimationDelegate:self
,然后执行
setAnimationDidEndSelector:@selector(myMethod:finished:context:)
,然后在方法中将上下文强制转换为
UIBarButtonim
,并重新启用它

我不认为您可以使用@selector将多个参数传递给选择器,但是您可以将您的按钮设置为类变量,并像在选择器中那样启用或禁用它(而不是将其作为参数传递),以定义具有多个参数的选择器,您可以使用NSInvocation,如下所示

NSInvocation *inv = [[NSInvocation alloc] init];
[inv setSelector:@selector(foo:bar:)];
[inv setArgument:123 atIndex:0];
[inv setArgument:456 atIndex:1];

但是我认为这对您正在尝试的操作不起作用。

我不认为您可以通过使用@selector将多个参数传递给选择器,但是您可以将按钮设置为类变量,并像在选择器中那样启用或禁用它(而不是将其作为参数传递),要使用多个参数定义选择器,可以使用NSInvocation,如下所示

NSInvocation *inv = [[NSInvocation alloc] init];
[inv setSelector:@selector(foo:bar:)];
[inv setArgument:123 atIndex:0];
[inv setArgument:456 atIndex:1];

但我认为这对您正在尝试的操作不起作用。

来自UIView的
setAnimationDidStopSelector:
docs:

选择器的格式应为:
-(void)animationDidStop:(NSString*)animationID finished:(NSNumber*)finished context:(void*)context


第三个参数,
context
,是您选择的对象,设置在
beginAnimations:context:
中。因此,您缺少的似乎是使用
barButton
作为
context
参数,然后使用正确的签名重写
enableControl
。在该方法中,您使用第三个参数
context
,并将其从UIView的
setAnimationDidStopSelector:
docs:

选择器的格式应为:
-(void)animationDidStop:(NSString*)animationID finished:(NSNumber*)finished context:(void*)context


第三个参数,
context
,是您选择的对象,设置在
beginAnimations:context:
中。因此,您缺少的似乎是使用
barButton
作为
context
参数,然后使用正确的签名重写
enableControl
。在该方法中,您使用第三个参数,
context
,并将其从
void*
转换为
UIBarButtonItem*

首先,我没有说我需要多个参数,我只想要一个。其次,我说我不想使用ivar(或类变量),我的意思是你不能将aribitrary参数传递给选择器。首先,我没有说我需要多个参数,我只想要一个。其次,我说我不想使用ivar(或类变量),我的意思是你不能将aribitrary参数传递到SelectorTanks。你唯一没有提到的是你需要先做[UIView setAnimationDelegate:self]。谢谢,你唯一没有提到的是你需要先做[UIView setAnimationDelegate:self]。编辑时,不要删除原始问题…我将原始问题放回原处。编辑时,不要删除原始问题…我将原始问题放回原处。