iPhone:使用BOOL参数执行select器?

有没有办法在select器中发送BOOL?

[self performSelector:@selector(doSomething:) withObject:YES afterDelay:1.5]; 

或者我应该使用NSInvocation? 有人可以写样品吗?

你可以使用NSNumber来包装boolstypes:

 BOOL myBool = Yes; NSNumber *passedValue = [NSNumber numberWithBool:myBool]; [self performSelector:@selector(doSomething:) withObject:passedValue afterDelay:1.5]; 

并在select器中获取布尔值,您可以使用:

 BOOL value = [recievedObject boolValue]; 

在你不能改变目标方法签名来接受NSNumber代替BOOL你可以使用NSInvocation而不是performSelector

 MyTargetClass* myTargetObject; BOOL myBoolValue = YES; // or NO NSMethodSignature* signature = [[myTargetObject class] instanceMethodSignatureForSelector: @selector( myMethodTakingBool: )]; NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: signature]; [invocation setTarget: myTargetObject]; [invocation setSelector: @selector( myMethodTakingBool: ) ]; [invocation setArgument: &myBoolValue atIndex: 2]; [invocation invoke]; 

最简单的方法如下:

如果你有方法

 -(void)doSomething:(BOOL)flag 

并希望执行标记= NO使用

 [object performSelector:@selector(doSomething:) withObject:nil]; 

在flag = YES的情况下,你可以发送任何对象,例如@YES – 来自bool的号码

  [object performSelector:@selector(doSomething:) withObject:@YES]; 

注意:不要使用@NO! 在你的方法中,只有nil将被解释为NO和bool参数。

在主线程中使用dispatch_after,如下所示:

 dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (_animationDuration+1) * NSEC_PER_SEC); dispatch_after(delayTime, dispatch_get_main_queue(), ^{ [self completeAnimation:NO]; }); 

如果你想通过一个NO,只有一个NO,你可以把一个零代替

 [self performSelector:@selector(doSomething:) withObject:0 afterDelay:1.5]; 

但请记住,只是为零工作,不用ARC编译,不允许隐式转换

它可能不是最优雅的,但我创build了另一个例程与布尔调用例程。 这使select器的东西简单,不需要访问来改变原来的例程。

[由Ash添加]下面是一个样例,当设置一个布尔属性时closures接收者的alpha值:

 - (void) setVisible:(BOOL)visible { _visible = visible; self.alpha = 0.0; } - (void) setVisibleUsingNSNumber:(NSNumber *)visible { self.visible = [visible boolValue]; } 

你可以在延迟后触发这个:

 [self performSelector:@selector(setVisibleUsingNSNumber:) withObject:[NSNumber numberWithBool:YES] afterDelay:0.5]; 

请注意,现在也可以使用Grand Central Dispatch,在这种情况下,您可以绕过所有这些额外的代码,在块内部使用标准的setter方法。 但是,取消performSelector调用要比在延迟块执行中检测取消要容易得多。

另一种做法是将NONO传递给YES

[self performSelector:@selector(doSomething 🙂 withObject:nil];

doSomething for BOOL参数将没有任何值

[self performSelector:@selector(doSomething 🙂 withObject:[NSNumber numberWithBool:YES]];

doSomething for BOOL参数将具有YES值

[self performSelector:@selector(doSomething 🙂 withObject:[NSNumber numberWithBool:NO]];

doSomething for BOOL参数将具有YES值(即使通过也是NO)

你不能像这样向select器发送参数。

你可能想看看下面的答案:

使用参数从方法名称创buildselect器

从另一个post中看到了这个诀窍,但是通过了NO和NO。

如果你在静态传递BOOL参数,那么你可以使用下面的..

——> 通过“否”:


 [self performSelector:@selector(doSomething:) withObject:0 afterDelay:1.5]; 

现在得到TimeInterval后的结果:

 -(void)doSomething:(BOOL)isDoSomething { NSLog(isDoSomething?@"Do Something":@"Don't Do Any Thing"); } 

在这里,你会 在日志中 得到“ 不要做任何事情 ”。


——> 通过“是”:


 [self performSelector:@selector(doSomething:) withObject:@"1" afterDelay:1.5]; 

现在得到TimeInterval后的结果:

 -(void)doSomething:(BOOL)isDoSomething { NSLog(isDoSomething?@"Do Something":@"Don't Do Any Thing"); } 

在这里你会得到 日志中的 做某些事情 ”。


使用Objective-C文字,可以expression得更加细致。

 [self performSelector:@selector(doSomething:) withObject:@(YES) afterDelay:1.5]; 

注意@(YES) iso YES

而不是依靠NSInvocation或不得不修改方法来使用NSNumber这可以通过创build一个视图更优雅地做,例如:

 @interface CLLocationManager(CompatibleView) @property (nonatomic) BOOL allowsBackgroundLocationUpdates; @end @implementation SampleClass - (void)sampleFunc:(CLLocationManager *)locationManager { if ([locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) { locationManager.allowsBackgroundLocationUpdates = YES; } } @end 

尝试包装你的布尔在一个NSNumber: [NSNumber numberWithBool:myBool]

而你可以用[myNumber boolValue]

我这样做:

 [_button performSelector:@selector(setUserInteractionEnabled:) withObject:[NSString stringWithFormat:@"YES"] afterDelay:nil];