2012-03-31 16 views
5

Tengo este código en un método prepareForSegueObjective-C Llamar a un selector que el compilador no creer que existe (aunque sabemos que hace)

// Get destination view 
    UIViewController *viewController = [segue destinationViewController]; 

    //See if it responds to a selector 
    if ([viewController respondsToSelector:@selector(setSomethingOrOther:)]) { 
     //if so call it with some data 
     [viewController setSomethingOrOther:something]; 
    } 

El código anterior significa que no tiene que incluir una referencia a la clase real del controlador de vista que se segue'd a. Puedo acoplar de forma más suelta los dos controladores de vista y simplemente verificar si responde a alguna propiedad que se establezca en él.

El problema es que cuando hago esto me sale el siguiente error de tiempo de compilación:

Sin @interface visibles para 'UIViewController' declara el selector 'setSomethingOrOther:'

lo cual es cierto, por supuesto, . Sé que podría evitarlo al incluir una referencia a la vista, pero preferiría mantenerlo separado. ¿Cómo puedo solucionar este

Respuesta

10

Utilice el método performSelector:aSelector, a continuación, puede llamar a un selector no declarado.

+0

Gracias, me siento como un idiota. He usado esto un poco en otros escenarios. –

7
[viewController performSelector:@selector(setSomethingOrOther:) 
        withObject:something]; 
+0

Agradable, claro, código de muestra +1 –

3

También puede hacer esto

[(id)viewController setSomethingOrOther:something]; 

en alguna situación, pero el compilador se quejará si no sabe de la existencia de setSomethingOrOther: en absoluto, como una biblioteca que no se ha incluido la encabezado para.

+0

Ese es realmente el punto de esta pregunta; No quiero incluir el encabezado en absoluto. Quiero más separación entre mis ViewControllers. –

+0

No ha leído mi respuesta correctamente, esto funcionará si el método está definido en algún lugar de su proyecto, simplemente no desea incluir el encabezado. –

+0

oh, suficiente. –

Cuestiones relacionadas