Question

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?

Was it helpful?

Solution 2

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.

OTHER TIPS

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
}];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top