将 BOOL 传递给 makeObjectsPerformSelector:withObject:

Posted

技术标签:

【中文标题】将 BOOL 传递给 makeObjectsPerformSelector:withObject:【英文标题】:Passing BOOL to makeObjectsPerformSelector:withObject: 【发布时间】:2011-03-21 07:18:31 【问题描述】:

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

[buttons makeObjectsPerformSelector:@selector(setEnabled:) withObject: NO];

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

正确的做法是什么?

我看到了一些这样的代码:

[buttons makeObjectsPerformSelector:@selector(setEnabled:) withObject: (id)kCFBooleanTrue];
[buttons makeObjectsPerformSelector:@selector(setEnabled:) withObject: (id)kCFBooleanFalse];

这在 4.2 模拟器上运行良好,但在 4.2 iphone 上失败。

【问题讨论】:

【参考方案1】:

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

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

@implementation UIButton(setEnabledWithObject)
- (void)setEnabledWithNSNumber:(NSNumber *)bNum 
    [self setEnabled:[bNum boolValue]];

@end

然后你可以使用

[buttons makeObjectsPerformSelector:@selector(setEnabledWithNSNumber:) withObject:[NSNumber numberWithBool:NO]];
[buttons makeObjectsPerformSelector:@selector(setEnabledWithNSNumber:) withObject:[NSNumber numberWithBool:YES]];

【讨论】:

谢谢!这将起作用。我希望他们有更简单的方法。【参考方案2】:

我记得除了withObject:@YES 之外,我还必须做点别的事情,但由于我再也找不到它了,我发现它也适用于

[buttons enumerateObjectsUsingBlock:^(NSButton *item, NSUInteger idx, BOOL *stop) 
    [item setEnabled:YES];];

或者更快/更老/更易读的:)方式:

for (NSButton *item in buttons) [item setEnabled:YES];;

应该知道 enumerateObjectsUsingBlock 并不是特别快,但无论如何它不应该是一个巨大的杀手 :) 如果你想要快,你也可以使用 for (;;) 块来做到这一点,当然 :)

【讨论】:

【参考方案3】:

请看以下重复的问题:

How to use performSelector:withObject:afterDelay: with primitive types in Cocoa?。

Using performSelector:withObject:afterDelay: with non-object parameters

SEL performSelector and arguments

希望对你有帮助。

【讨论】:

【参考方案4】:

如果您在静态中传递 BOOL 参数,那么我在 link 中的回答会有所帮助..

【讨论】:

以上是关于将 BOOL 传递给 makeObjectsPerformSelector:withObject:的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能直接将 int 或 bool 传递给 OCMock 的“andReturnValue”参数?

将 std::array 传递给函数:默认值

传递 BOOL 值

如何在 Objective-C 中将 BOOL 变量作为参数传递?

为啥 JSON bool 数据作为字符串传递给 Django 后端?

如何快速将数组传递给 NSNotification