我有一个调用该交换在一个动画块的两个视图的动作的barButtonItem。我在它调用的操作方法的开头禁用barButtonItem,而我希望在其完成启用它,所以它之前已经完成翻转,用户无法再次翻转视图。

它这样做是在一个UIView动画块,所以如果我在定义方法启用它,它就会瞬间,因为它被动画完成之前启用,破坏的目的。

在该方法中,我投发送者到的UIBarButtonItem,我禁用。所以我发现[UIView setAnimationDidStopSelector:@selector()],但我需要通过我的barButtonItem在选择这样enableControl方法将启用(这将是一个容易得多,如果我可以做一个匿名函数..)。

那么,如何可以通过barButton作为参数?我宁愿没有做只是为了这个伊娃..下面的代码:

- (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并重新启用它。

有帮助吗?

解决方案

从的UIView的setAnimationDidStopSelector:文档:

  

在选择应该是以下形式:- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context

第三个参数,context,是你的选择,在设定beginAnimations:context:的目的。因此,它似乎像什么你缺少的是使用barButton作为context参数,然后用适当的签名改写enableControl。在该方法中,你把第三个参数,context,和从void*浇铸到一个UIBarButtonItem*

其他提示

我不认为你可以使用@selector传递多个参数的选择,但是你可以让你的按钮类变量,并启用或选择这样的禁用它(而不是将其作为参数传递) ,以限定具有多个参数的选择器就可以使用NSInvocation的,像这样

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

但我不认为这会为你正在尝试做的工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top