Ios 将makeObjectsPerformSelector:withObject:与假布尔值一起使用
我有一个名为Ios 将makeObjectsPerformSelector:withObject:与假布尔值一起使用,ios,cocoa-touch,foundation,Ios,Cocoa Touch,Foundation,我有一个名为\u fields的UITextField对象数组。我希望能够一次向所有对象发送消息,将它们设置为突出显示的,然后执行相同的操作,将突出显示的属性设置为否。这部分代码是有效的 [fields makeObjectsPerformSelector:@selector(setHighlighted:) withObject:@YES]; 然而,这一部分没有;我不能让它做任何事 [fields makeObjectsPerformSelector:@selector(setHighlig
\u fields
的UITextField
对象数组。我希望能够一次向所有对象发送消息,将它们设置为突出显示的
,然后执行相同的操作,将突出显示的属性设置为否
。这部分代码是有效的
[fields makeObjectsPerformSelector:@selector(setHighlighted:) withObject:@YES];
然而,这一部分没有;我不能让它做任何事
[fields makeObjectsPerformSelector:@selector(setHighlighted:) withObject:@NO];
然而,这确实有效
for (UITextField *field in fields) {
field.highlighted = NO;
}
有什么好处?我本想使用makeObjectsPerformSelector:withObject:
消息,但我不太喜欢@NO
。有人能给我解释一下这种行为,或者告诉我我是否做错了什么吗?您应该尝试使用块,因为setHighlighted将BOOL作为参数,而不是指针(NSNumber*):
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正确地打开装箱的值。似乎我是在错误的假设下操作的@BOOL
。我将使用循环。谢谢大家!@YES
只是[NSNumber numberWithBool:YES]
的快捷方式。不能将NSNumber*
传递给采用BOOL
的方法。如Dave在回答中所述,与使用自己的循环相比,使用EnumerateObjectsSusingBlock
是一个很好的选择。虽然各种@
语法可以进行一些方便的装箱,但Objective-C中没有拆箱语法或任何类型的自动拆箱。KVC执行自动拆箱。看看我的答案。老鼠…我希望我能接受这两个答案。我能给你打个对勾吗?(谢谢,@robmayoff!)
[fields setValue:@NO forKey:@"hidden"];