Попытка передать CGrect для выполнения выбора с помощью объекта - PullRequest
5 голосов
/ 20 февраля 2010

Я пытаюсь передать 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)

Как я могу решить эту проблему?

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 23 декабря 2014

Вы должны использовать 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];
5 голосов
/ 20 февраля 2010
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?

...