Frage

Ich versuche, einen CGRect weitergeben müssen:

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

Aber das bedeutet nicht Kompilierung

Ich habe auch versucht:

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

Eigentlich ist dies nicht kompiliert, aber wenn ich zu debuggen, wird der Rahmen nicht richtig gefassten:

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

Aber es sollte Rahmen sein = (10 10; 200 100)

Wie kann ich dieses Problem lösen?

Vielen Dank im Voraus!

War es hilfreich?

Lösung

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

Aber das bedeutet nicht Kompilierung

Richtig, denn rect ist eine Struktur, kein Zeiger auf ein Objekt.

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

Eigentlich ist dies nicht kompiliert, aber wenn ich zu debuggen, wird der Rahmen nicht richtig gefassten:

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

Nun, es ist nicht Müll, so würde es scheinen, dass es geklappt hat, obwohl der Ursprung blieb irgendwie Null. Sie können eine separate Frage danach fragen wollen.

Wie auch immer, warum verwenden Sie performSelector:withObject:? Sie sind nicht an einen bestimmten Thread-Adressierung und Sie sie nicht auf einer Verzögerung setzen; warum nicht einfach object.frame = rect sagen?

Andere Tipps

Sie müssen eine NSInvocation verwenden, um alle nicht-id Argumente oder Rückgabewerte zu behandeln:

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];
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top