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调用要比在延迟块执行中检测取消要容易得多。
另一种做法是将NO
和NO
传递给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];