将BOOL传递给makeObjectsPerformSelector:withObject:

Pok*_*com 10 iphone nsarray

我想将BOOL传递给[NSArray makeObjectsPerformSelector:withObject:]参数.例如

[buttons makeObjectsPerformSelector:@selector(setEnabled:) withObject: NO];
Run Code Online (Sandbox Code Playgroud)

上面的代码不起作用,因为withObject只接受id.

什么是正确的方法呢?

我看到了一些代码:

[buttons makeObjectsPerformSelector:@selector(setEnabled:) withObject: (id)kCFBooleanTrue];
[buttons makeObjectsPerformSelector:@selector(setEnabled:) withObject: (id)kCFBooleanFalse];
Run Code Online (Sandbox Code Playgroud)

这在4.2模拟器上工作正常但在4.2 iphone上失败.

Mat*_*uch 10

您可以编写一个UIButton(甚至UIView)类别,允许您将setEnabled:与对象一起使用.

@interface UIButton(setEnabledWithObject)
- (void)setEnabledWithNSNumber:(NSNumber *)bNum;
@end

@implementation UIButton(setEnabledWithObject)
- (void)setEnabledWithNSNumber:(NSNumber *)bNum {
    [self setEnabled:[bNum boolValue]];
}
@end
Run Code Online (Sandbox Code Playgroud)

然后你可以使用

[buttons makeObjectsPerformSelector:@selector(setEnabledWithNSNumber:) withObject:[NSNumber numberWithBool:NO]];
[buttons makeObjectsPerformSelector:@selector(setEnabledWithNSNumber:) withObject:[NSNumber numberWithBool:YES]];
Run Code Online (Sandbox Code Playgroud)


Stu*_* mc 6

我记得有一个人不得不做别的事情,withObject:@YES但由于我再也找不到了,我发现它的效果也很好

[buttons enumerateObjectsUsingBlock:^(NSButton *item, NSUInteger idx, BOOL *stop) 
    {[item setEnabled:YES];}];
Run Code Online (Sandbox Code Playgroud)

或更快/更旧/可读的:)方式:

for (NSButton *item in buttons) {[item setEnabled:YES];};
Run Code Online (Sandbox Code Playgroud)

应该知道enumerateObjectsUsingBlock不是特别快,但它不应该是一个巨大的杀手在这里:)如果你想要快,你也可以用for (;;)块,确保:)