2010-02-20 16 views
5

Je suis en train de passer un CGRect:Essayer de passer CGRect à performSelector withObject

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

Mais cela ne compile pas

J'ai aussi essayé:

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

En fait, cela ne compiler mais quand je debug, le cadre est pas correctement paramétré:

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

Mais ce devrait être frame = (10 10; 200 100)

Comment puis-je résoudre ce problème?

Merci d'avance!

Répondre

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

Mais cela ne compile pas

correcte, parce que rect est une structure, pas un pointeur sur un objet.

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

En fait, cela ne compile mais quand je debug, le cadre est pas paramétré correctement:

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

Eh bien, ce n'est pas des ordures, il semble que cela a fonctionné, même si l'origine est restée en quelque sorte nulle. Vous voudrez peut-être poser une question distincte à ce sujet. En tout cas, pourquoi utilisez-vous performSelector:withObject:? Vous ne vous adressez pas à un fil spécifique et vous ne le mettez pas en retard; pourquoi ne pas simplement dire object.frame = rect?

+0

objet est de type NSObject * Je ne peux pas dire simplement object.frame je vraiment besoin d'utiliser NSObject * >>> Eh bien, ce n'est pas de la foutaise, il semblerait donc que cela a fonctionné, même si l'origine est restée en quelque sorte nulle. Vous voudrez peut-être poser une question distincte à ce sujet. J'ai vraiment besoin d'une réponse à cette question. Merci! –

+0

Si vous savez qu'il possède une propriété 'frame', placez-le dans' UIView * ', puis utilisez' object.frame = rect'. Si vous ne savez pas qu'il possède une propriété 'frame', utilisez KVC (http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/KeyValueCoding/) pour définir la propriété et intercepter l'exception Cela arrivera s'il n'en a pas. –

5

Vous devez utiliser un NSInvocation pour gérer tous les arguments non-id ou renvoyer des valeurs:

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];