iPhone:performSelector与BOOL参数?

时间:2011-08-16 08:42:05

标签: iphone

有没有办法在选择器中发送BOOL?

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

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

14 个答案:

答案 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)

你不能向这样的选择器发送参数。

您可能需要查看以下答案:

Creating a selector from a method name with parameters

答案 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];