2012-03-31 7 views
5

Ho questo codice in un metodo prepareForSegueObjective-C Chiamata di un selettore che il compilatore non crede esiste (anche se sappiamo che fa)

// 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]; 
    } 

Il codice di cui sopra significa che non è necessario includere una riferimento alla classe effettiva del controller della vista che viene seguita. Posso accoppiare più liberamente i due controller di visualizzazione e controllare se risponde a qualche proprietà impostata su di esso.

Il problema è che quando faccio questo ricevo il seguente errore di compilazione:

No @interface visibile per 'UIViewController' dichiara il selettore 'setSomethingOrOther:'

che è vero, naturalmente, . So che potrei aggirarlo includendo un riferimento alla vista, ma preferirei tenerlo separato. Come posso ovviare a questo

risposta

10

Utilizzare il metodo performSelector:aSelector, quindi è possibile chiamare un selettore non dichiarato.

+0

Grazie, mi sento un idiota. Ho usato questo un po 'giusto in altri scenari. –

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

Bello, chiaro, codice di esempio +1 –

3

Si può anche fare questo

[(id)viewController setSomethingOrOther:something]; 

in qualche situazione, ma ho il compilatore si lamenta se non conosce l'esistenza di setSomethingOrOther: a tutti, come una biblioteca che non hai incluso la intestazione per.

+0

Questo è in realtà il punto di questa domanda; Non voglio affatto includere l'intestazione. Voglio più separazione tra i miei ViewControllers. –

+0

Non hai letto correttamente la mia risposta, questo funzionerà se il metodo è definito da qualche parte nel tuo progetto semplicemente non vuoi includere l'intestazione. –

+0

oh abbastanza giusto .. –