45

有没有办法发送一个BOOLin 选择器?

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

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

4

14 回答 14

69

如果您无法更改目标方法签名以接受 aNSNumber代替 aBOOL您可以使用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];
于 2013-01-04T17:25:17.637 回答
56

你可以使用 NSNumber 来包装 bool 类型:

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

在选择器中,要获取布尔值,请使用:

BOOL value = [recievedObject boolValue];
于 2011-08-16T08:51:19.327 回答
18

最简单的方法如下:

如果你有方法

-(void)doSomething:(BOOL)flag

并希望使用 flag=NO 使用 performSelecor

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

在 flag=YES 的情况下,您可以发送任何对象,例如 @YES - bool 中的数字

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

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

于 2014-01-24T20:19:22.940 回答
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];
});
于 2013-03-07T06:07:35.167 回答
6

如果你想传递一个 NO,并且只有一个 NO,你可以输入一个零

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

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

于 2012-06-29T13:08:23.490 回答
5

另一种方法是通过nilforNOanything elseforYES

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

BOOL 参数的 doSomething 将没有值

--

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

BOOL 参数的 doSomething 将具有 YES 值

--

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

BOOL 参数的 doSomething 将具有 YES 值(即使传递的是 NO 的数字)

于 2015-01-30T09:40:45.527 回答
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 调用比在延迟的块执行中检测取消要容易得多。

于 2013-02-26T17:50:55.943 回答
2

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

您可能想看看以下答案:

从带有参数的方法名称创建选择器

于 2011-08-16T08:47:57.183 回答
2

在另一篇文章中看到了这个技巧,但将 nil 表示为 NO,将 self 表示为 YES。

于 2012-06-29T00:28:41.790 回答
2

使用 Objective-C 文字,这可以表达得不那么冗长。

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

注意@(YES)isoYES

于 2014-05-22T13:45:26.873 回答
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");
}

在这里,您将 在日志中获得“做某事”。


于 2013-12-11T08:08:06.227 回答
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
于 2015-09-02T00:54:36.240 回答
0

尝试将您的布尔值包装在 NSNumber 中:[NSNumber numberWithBool:myBool]

你可以把它拿回来[myNumber boolValue]

于 2011-08-16T08:45:35.163 回答
0

我这样做:

[_button performSelector:@selector(setUserInteractionEnabled:) withObject:[NSString stringWithFormat:@"YES"] afterDelay:nil];
于 2013-05-28T09:06:03.850 回答