Essayer de passer CGRect à performSelector withObject
-
21-09-2019 - |
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!
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];