4

我有一个UITextField名为_fields. 我希望能够一次向它们发送消息以将它们设置为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. 有人可以向我解释这种行为,或者告诉我我是否做错了什么?

4

3 回答 3

13

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

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

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

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

于 2013-06-17T21:16:31.257 回答
12

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

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

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

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

于 2013-06-17T21:04:45.903 回答
0

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

[fields enumerateObjectsUsingBlock:^(UITextField *obj, NSUInteger idx, BOOL *stop) {
    obj.highlighted = YES; // or NO
}];
于 2013-06-17T21:04:24.403 回答