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
, and then do the same to turn that highlighted
property to NO
. This part of the code works.
[fields makeObjectsPerformSelector:@selector(setHighlighted:) withObject:@YES];
This part, however, does not; I can't get it to do anything.
[fields makeObjectsPerformSelector:@selector(setHighlighted:) withObject:@NO];
This does work, however.
for (UITextField *field in fields) {
field.highlighted = NO;
}
What gives? I would've liked to have used the makeObjectsPerformSelector:withObject:
message, but I'm not getting much love with @NO
. Can someone explain this behavior to me, or tell me if I'm doing something wrong?
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With