在IPhone选择传递参数
-
11-07-2019 - |
题
我有一个调用该交换在一个动画块的两个视图的动作的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];
但我不认为这会为你正在尝试做的工作。