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