有没有办法在选择器中发送BOOL?
[self performSelector:@selector(doSomething:) withObject:YES afterDelay:1.5];
或者我应该使用NSInvocation?有人可以写一个样品吗?
答案 0 :(得分:64)
如果您无法更改目标方法签名以接受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];
答案 1 :(得分:55)
你可以使用NSNumber来包装bools类型:
BOOL myBool = YES;
NSNumber *passedValue = [NSNumber numberWithBool:myBool];
[self performSelector:@selector(doSomething:) withObject:passedValue afterDelay:1.5];
并在选择器中,要获取bool值,请使用:
BOOL value = [recievedObject boolValue];
答案 2 :(得分:19)
最简单的方法如下:
如果你有方法
-(void)doSomething:(BOOL)flag
并希望使用flag = NO use
执行Selecor[object performSelector:@selector(doSomething:) withObject:nil];
如果flag = YES,您可以发送任何对象,例如@YES - 来自bool的数字
[object performSelector:@selector(doSomething:) withObject:@YES];
注意:不要使用@NO!在bool参数的方法中,只有nil会被解释为NO。
答案 3 :(得分:14)
在主线程中使用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];
});
答案 4 :(得分:6)
如果你想传递一个NO,只有一个NO,你可以把零代替
[self performSelector:@selector(doSomething:) withObject:0 afterDelay:1.5];
但请记住,只需工作为零,不用ARC编译,不允许隐式转换
答案 5 :(得分:5)
另一种方法是为 nil
和 传递 NO
anything else
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)
答案 6 :(得分:4)
它可能不是最优雅但我创建了另一个用bool调用例程的例程。这使选择器的内容变得简单,并且不需要访问来更改原始例程。
[由Ash添加]这是一个在设置布尔属性时调低接收者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调用比在延迟块执行中检测取消要容易得多。
答案 7 :(得分:2)
答案 8 :(得分:2)
看到这个技巧形成了另一个帖子,但是传递nil为NO和self为YES。
答案 9 :(得分:2)
使用Objective-C文字,这可以表达得更简洁。
[self performSelector:@selector(doSomething:) withObject:@(YES) afterDelay:1.5];
注意@(YES)
i.s.o. YES
答案 10 :(得分:1)
如果您以静态方式传递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");
}
在这里,您将在日志中获得 做某事 '。
答案 11 :(得分:1)
不是依赖于NSInvocation或者必须修改方法来使用NSNumber,而是可以通过创建视图来更优雅地完成这一点,例如:
@interface CLLocationManager(CompatibleView)
@property (nonatomic) BOOL allowsBackgroundLocationUpdates;
@end
@implementation SampleClass
- (void)sampleFunc:(CLLocationManager *)locationManager {
if ([locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
locationManager.allowsBackgroundLocationUpdates = YES;
}
}
@end
答案 12 :(得分:0)
尝试将您的bool包装在NSNumber中:[NSNumber numberWithBool:myBool]
你可以用[myNumber boolValue]
答案 13 :(得分:0)
我是这样做的:
[_button performSelector:@selector(setUserInteractionEnabled:) withObject:[NSString stringWithFormat:@"YES"] afterDelay:nil];