I\'ve got an array of UITextField objects called _fields. I want to be able to message them all at once to set them to be highlighted,
rmaddy's answer explains why using makeObjectsPerformSelector:withObject: won't work.
You can do this most succinctly by using KVC:
[fields setValue:@NO forKey:@"hidden"];
This works because NSArray passes the setValue:forKey: message through to each of its elements, and KVC properly unwraps the boxed value when the property's type is primitive.
You should try using blocks because setHighlighted takes a BOOL as a parameter and not a pointer (NSNumber *) :
[fields enumerateObjectsUsingBlock:^(UITextField *obj, NSUInteger idx, BOOL *stop) {
obj.highlighted = YES; // or NO
}];
The setHighlighted: method takes a type of BOOL. This is not an object type. Therefore you can't use the makeObjectsPerformSelector:withObject: method.
It seems to work when passing @YES because you are passing a pointer to an object to the BOOL parameter. The non-zero value gets treated like a YES value. When you pass @NO you are also passing a pointer. Since it is also a non-zero value, it also gets treated like a YES value.
You may get the desired effect of NO by passing nil to the withObject: parameter. The nil value will be 0 which is the same value as NO.
But these are kludges. Use the loop approach instead.