使用makeObjectsPerformSelector:withObject:with false boolean
我有一个名为_fields
的UITextField
对象数组。 我希望能够立即向所有人发送消息以将其设置为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:
message,但我对@NO
并@NO
。 有人可以向我解释这种行为,或者告诉我我是否做错了什么?
setHighlighted:
方法采用BOOL
类型。 这不是对象类型。 因此,您不能使用makeObjectsPerformSelector:withObject:
方法。
它在传递@YES
时似乎有效,因为您将指向对象的指针传递给BOOL
参数。 非零值被视为YES
值。 当你传递@NO
你也传递了一个指针。 由于它也是非零值,因此它也被视为YES
值。
通过将nil
传递给withObject:
参数,可以获得所需的NO
效果。 nil
值为0,与NO
值相同。
但这些都是克拉奇。 请改用循环方法。
rmaddy的答案解释了为什么使用makeObjectsPerformSelector:withObject:
将无效。
您可以使用KVC最简洁地完成此操作:
[fields setValue:@NO forKey:@"hidden"];
这是有效的,因为NSArray
将setValue:forKey:
消息传递给它的每个元素,当属性的类型是原始时,KVC正确地解包盒装值。
您应该尝试使用块,因为setHighlighted将BOOL作为参数而不是指针(NSNumber *):
[fields enumerateObjectsUsingBlock:^(UITextField *obj, NSUInteger idx, BOOL *stop) { obj.highlighted = YES; // or NO }];