2010-02-20 21 views
5

Estoy tratando de pasar una CGRect:tratando de pasar a CGRect performSelector withObject

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

Pero esto no compila

También probé:

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

En realidad, esto hace compilar pero cuando depuro, el marco no está configurado correctamente:

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

Pero debe ser frame = (10 10; 200 100)

¿Cómo puedo resolver este problema?

¡Gracias de antemano!

Respuesta

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

Pero esto no compila

correcta, porque rect es una estructura, no es un puntero a un objeto.

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

En realidad, esto se compila pero cuando elimino errores, la trama no se setted correctamente:

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

Bueno, no es basura, por lo que parece que ha funcionado, incluso aunque el origen de alguna manera permaneció cero. Es posible que desee hacer una pregunta por separado sobre eso.

De todos modos, ¿por qué estás usando performSelector:withObject:? No lo está dirigiendo a un hilo específico y no lo está retrasando; ¿por qué no simplemente decir object.frame = rect?

+0

objeto es de tipo NSObject * No puedo decir simplemente object.frame Es realmente necesario utilizar NSObject * >>> Bueno, no es basura, por lo que parece que funcionó, aunque el origen de alguna manera se mantuvo en cero. Es posible que desee hacer una pregunta por separado sobre eso. Realmente necesito una respuesta sobre esa pregunta. ¡Gracias! –

+0

Si sabe que tiene una propiedad 'frame', empújela a' UIView * 'y luego use' object.frame = rect'. Si no sabe que tiene una propiedad 'frame', use KVC (http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/KeyValueCoding/) para establecer la propiedad, y capture la excepción que sucederá si no tiene uno. –

5

Debe utilizar un NSInvocation para manejar cualquier argumento que no sea de identificación o devolver valores:

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]; 
Cuestiones relacionadas