尝试将CGrect传递给performSelector withObject

Fab*_*lli 5 iphone cocoa-touch selector argument-passing

我正在尝试传递CGRect:

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

但这不编译

我也尝试过:

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

实际上,这确实编译但是当我调试时,框架没有正确设置:

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

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

我怎么解决这个问题?

先感谢您!

Pet*_*sey 5

CGRect rect = CGRectMake(10, 10, 200, 100);
[object performSelector:frameSel withObject:rect ];
Run Code Online (Sandbox Code Playgroud)

但这不编译

正确,因为rect是结构,而不是指向对象的指针.

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

实际上,这确实编译但是当我调试时,框架没有正确设置:

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

嗯,它不是垃圾,所以看起来它有效,即使原点在某种程度上保持为零.你可能想问一个单独的问题.

无论如何,你为什么用performSelector:withObject:?你没有把它解决到一个特定的线程,你没有把它延迟; 为什么不简单说object.frame = rect


小智 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];
Run Code Online (Sandbox Code Playgroud)