【问题标题】:Using makeObjectsPerformSelector:withObject: with a false boolean将 makeObjectsPerformSelector:withObject: 与 false 布尔值一起使用
【发布时间】:2013-06-17 21:00:13
【问题描述】:

我有一个名为 _fieldsUITextField 对象数组。我希望能够一次向它们发送消息以将它们设置为highlighted,然后将highlighted 属性设置为NO。这部分代码有效。

[fields makeObjectsPerformSelector:@selector(setHighlighted:) withObject:@YES];

但是,这部分没有;我不能让它做任何事情。

[fields makeObjectsPerformSelector:@selector(setHighlighted:) withObject:@NO];

不过,这确实有效。

for (UITextField *field in fields) {
    field.highlighted = NO;
}

什么给了?我本来希望使用makeObjectsPerformSelector:withObject: 消息,但我对@NO 并不感兴趣。有人可以向我解释这种行为,或者告诉我我是否做错了什么?

【问题讨论】:

    标签: ios cocoa-touch foundation


    【解决方案1】:

    rmaddy 的回答解释了为什么使用 makeObjectsPerformSelector:withObject: 不起作用。

    您可以使用 KVC 最简洁地做到这一点:

    [fields setValue:@NO forKey:@"hidden"];
    

    之所以有效,是因为NSArraysetValue:forKey: 消息传递给它的每个元素,并且当属性的类型是原始类型时,KVC 会正确解开装箱的值。

    【讨论】:

    • 老鼠……我希望我能接受这两个答案。我可以给你半个复选标记吗? (谢谢,@robmayoff!)
    【解决方案2】:

    setHighlighted: 方法采用BOOL 类型。这不是对象类型。因此不能使用makeObjectsPerformSelector:withObject: 方法。

    在传递@YES 时似乎有效,因为您将指向对象的指针传递给BOOL 参数。非零值被视为YES 值。当您传递@NO 时,您也在传递一个指针。由于它也是一个非零值,因此它也被视为 YES 值。

    您可以通过将nil 传递给withObject: 参数来获得NO 所需的效果。 nil 的值为 0,与 NO 的值相同。

    但这些都是杂物。请改用循环方法。

    【讨论】:

    • 似乎我是在错误的假设下操作的,即 @BOOL 会起作用。我将改用循环。谢谢!
    • @YES 只是[NSNumber numberWithBool:YES] 的快捷方式。您不能将NSNumber * 传递给采用BOOL 的方法。正如 Dave 的回答中所述,使用 enumerateObjectsUsingBlock 是比使用您自己的循环更好的选择。
    • 虽然各种@ 语法做了一些方便的装箱,但在Objective-C 中没有拆箱语法或任何类型的自动拆箱。
    • KVC 自动拆箱。看我的回答。
    【解决方案3】:

    您应该尝试使用块,因为 setHighlighted 将 BOOL 作为参数而不是指针 (NSNumber *):

    [fields enumerateObjectsUsingBlock:^(UITextField *obj, NSUInteger idx, BOOL *stop) {
        obj.highlighted = YES; // or NO
    }];
    

    【讨论】:

      猜你喜欢
      • 2011-02-16
      • 2020-01-11
      • 2021-06-25
      • 1970-01-01
      • 2021-02-26
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      相关资源
      最近更新 更多