使用makeObjectsPerformSelector:withObject:with false boolean

Ben*_*ger 4 cocoa-touch foundation ios

我有一个UITextField叫做的对象数组_fields.我希望能够立即向他们发送消息以将其设置为highlighted,然后执行相同操作以将该highlighted属性转换为NO.这部分代码有效.

[fields makeObjectsPerformSelector:@selector(setHighlighted:) withObject:@YES];
Run Code Online (Sandbox Code Playgroud)

但是,这一部分没有; 我无法做任何事情.

[fields makeObjectsPerformSelector:@selector(setHighlighted:) withObject:@NO];
Run Code Online (Sandbox Code Playgroud)

但这确实有效.

for (UITextField *field in fields) {
    field.highlighted = NO;
}
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?我本来希望使用这个makeObjectsPerformSelector:withObject:消息,但我并没有太多的爱@NO.有人可以向我解释这种行为,或者告诉我,如果我做错了什么?

rob*_*off 13

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

您可以使用KVC最简洁地完成此操作:

[fields setValue:@NO forKey:@"hidden"];
Run Code Online (Sandbox Code Playgroud)

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


rma*_*ddy 12

setHighlighted:方法采用了一种类型BOOL.这不是对象类型.因此您无法使用该makeObjectsPerformSelector:withObject:方法.

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

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

但这些都是克拉奇.请改用循环方法.