Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 将makeObjectsPerformSelector:withObject:与假布尔值一起使用_Ios_Cocoa Touch_Foundation - Fatal编程技术网

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"];