Question

Je suis en train de passer un CGRect:

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

Mais cela ne compile pas

J'ai essayé aussi:

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 compile 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 il devrait être frame = (10 10; 200 100)

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

Merci d'avance!

Était-ce utile?

La solution

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

Mais cela ne compile pas

Corriger, 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 correctement paramétré:

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 zéro. Vous voudrez peut-être poser une autre question à ce sujet.

De toute façon, pourquoi utilisez-vous performSelector:withObject:? Vous n'êtes pas répondre à un fil spécifique et vous n'êtes pas le mettre sur un retard; pourquoi dire non seulement object.frame = rect?

Autres conseils

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];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top