5

我正在尝试传递一个 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>>

但它应该是 frame = (10 10; 200 100)

我怎么解决这个问题?

先感谢您!

4

2 回答 2

5
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

于 2010-02-20T15:12:38.153 回答
5

您必须使用 NSInvocation 来处理任何非 id 参数或返回值:

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];
于 2014-12-23T04:04:42.703 回答