【问题标题】:Passing BOOL to makeObjectsPerformSelector:withObject:将 BOOL 传递给 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 上失败。

【问题讨论】:

    标签: iphone nsarray


    【解决方案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】:
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多