使用makeObjectsPerformSelector:withObject:with false boolean

我有一个名为_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: 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"]; 

这是有效的,因为NSArraysetValue:forKey:消息传递给它的每个元素,当属性的类型是原始时,KVC正确地解包盒装值。

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

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