4

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?

4

3 に答える 3

13

rmaddy's answer は、使用makeObjectsPerformSelector:withObject:が機能しない理由を説明しています。

KVC を使用すると、これを最も簡潔に行うことができます。

[fields setValue:@NO forKey:@"hidden"];

これNSArrayが機能するのは、setValue:forKey:メッセージが各要素に渡され、プロパティの型がプリミティブの場合、KVC がボックス化された値を適切にアンラップするためです。

于 2013-06-17T21:16:31.257 に答える
12

setHighlighted:メソッドは の型を取りますBOOL。これはオブジェクト型ではありません。したがって、メソッドを使用することはできませんmakeObjectsPerformSelector:withObject:

パラメータ@YESにオブジェクトへのポインタを渡しているので、渡すとうまくいくようです。BOOLゼロ以外の値は値のように扱われYESます。渡す@NOと、ポインタも渡されます。これもゼロ以外の値であるため、YES値のように扱われます。

NOパラメータに渡すnilことで、目的の効果が得られる場合がありwithObject:ます。nil値は と同じ 0 になりますNO

しかし、これらはクラッジです。代わりにループ アプローチを使用してください。

于 2013-06-17T21:04:45.903 に答える
0

setHighlighted はポインター (NSNumber *) ではなく BOOL をパラメーターとして受け取るため、ブロックを使用してみてください。

[fields enumerateObjectsUsingBlock:^(UITextField *obj, NSUInteger idx, BOOL *stop) {
    obj.highlighted = YES; // or NO
}];
于 2013-06-17T21:04:24.403 に答える