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

时间:2009-08-03 19:09:05

标签: iphone uiview selector uibarbuttonitem

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

它在UIView动画块中执行此操作,因此如果我在方法的ned中启用它,它将是即时的并且会破坏目的,因为它在动画结束之前被启用。

在方法中,我将发送者强制转换为UIBarButtonItem,然后禁用它。所以我找到了[UIView setAnimationDidStopSelector:@selector()],但是我需要在选择器中传递我的barButtonItem,这样enableControl方法就会启用它(如果我可以创建一个匿名函数,这将会容易得多)。

那么如何将barButton作为参数传递?我宁愿不必为此制作一个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:),然后在方法强制转换上下文中uibarbuttonitem并重新启用它。

2 个答案:

答案 0 :(得分:3)

我不认为你可以使用@selector将多个参数传递给选择器,但是你可以使你的按钮成为一个类变量并在选择器中启用或禁用它(而不是作为参数传递) ,要定义具有多个参数的选择器,您可以使用NSInvocation,如此

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

但我不认为这会对你想做的事情有用。

答案 1 :(得分:3)

来自UIView的setAnimationDidStopSelector:文档:

  

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

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