我有一个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
并重新启用它。
答案 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*
。