5

CGRect を渡そうとしています:

SEL frameSel = NSSelectorFromString(@"setFrame:");
CGRect rect = CGRectMake(10, 10, 200, 100);
[object performSelector:frameSel withObject:rect ];

しかし、これはコンパイルされません

私も試しました:

SEL frameSel = NSSelectorFromString(@"setFrame:");
CGRect rect = CGRectMake(10, 10, 200, 100);
NSValue * value = [NSValue valueWithCGRect:rect];
[object performSelector:frameSel withObject:value ];

実際、これはコンパイルされますが、デバッグすると、フレームが正しく設定されません:

po object
<UILabel: 0x39220f0; frame = (0 0; 200 100); text = 'reflectionLabel'; clipsToBounds = YES; userInteractionEnabled = NO; layer = <CALayer: 0x3922240>>

ただし、フレーム = (10 10; 200 100) にする必要があります。

どうすればこの問題を解決できますか?

前もって感謝します!

4

2 に答える 2

5
CGRect rect = CGRectMake(10, 10, 200, 100);
[object performSelector:frameSel withObject:rect ];

しかし、これはコンパイルされません

rectオブジェクトへのポインターではなく、構造体であるため、正しいです。

CGRect rect = CGRectMake(10, 10, 200, 100);
NSValue * value = [NSValue valueWithCGRect:rect];
[object performSelector:frameSel withObject:value ];

実際、これはコンパイルされますが、デバッグすると、フレームが正しく設定されません:

po object
<UILabel: 0x39220f0; frame = (0 0; 200 100); text = 'reflectionLabel'; clipsToBounds = YES; userInteractionEnabled = NO; layer = <CALayer: 0x3922240>>

まあ、ゴミじゃないから何とか元はゼロのままだったのに動いたみたいだけど。それについては別の質問をしたいかもしれません。

とにかく、なぜあなたは使用していperformSelector:withObject:ますか?あなたはそれを特定のスレッドにアドレス指定していませんし、遅延させていません。なぜ単純に言わないのobject.frame = rectですか?

于 2010-02-20T15:12:38.153 に答える
5

ID 以外の引数または戻り値を処理するには、NSInvocation を使用する必要があります。

CGRect rect = CGRectMake(104, 300, 105, 106);
UIView *view = [[UIView alloc] init];

NSMethodSignature *methodSig = [view methodSignatureForSelector:@selector(setFrame:)];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:methodSig];
invocation.target = view;
invocation.selector = @selector(setFrame:);
[invocation setArgument:&rect atIndex:2];
[invocation invoke];
于 2014-12-23T04:04:42.703 に答える