iPhone – UIImagePickerControllerDelegate l’ereditarietà

Ho aggiunto un UIImagePickerController a un UIViewController . Ho anche assegnato UIImagePickerControllerDelegate a quel UIViewController .

Quando eseguo la seguente riga,

 myPicker.delegate = self; 

Xcode mi offre il seguente messaggio:

avviso: assegnazione all’ID da tipo incompatibile ‘RootViewController’

Quindi ho aggiunto il protocollo UINavigationControllerDelegate allo stesso UIViewController e il messaggio di errore è scomparso.

Quindi, devo aggiungere entrambi i protocolli a UIViewController quando aggiungo un UIImagePickerController ?

Se UIImagePickerController è una sottoclass di UINavigationController come indicato nei documenti, non dovrebbe essere automatico? Perché devo aggiungere il protocollo delegato di un genitore e non solo il protocollo UIImagePickerControllerDelegate ?

È un bug o mi sto perdendo qualcosa?

Come hai notato, UIImagePickerController eredita da UINavigationController . Utilizza comunque la stessa proprietà del delegate e non dichiara un (ipotetico) “imagePickerDelegate” di sua proprietà, quindi il delegato deve conformarsi a entrambi i protocolli. Ha senso, perché stai anche assegnando lo stesso delegato alla parte UINavigationController (che non conosce nulla sul selettore di immagini).

A mio avviso, il design dell’API è un po ‘discutibile, ma in ogni caso tutti i metodi in UINavigationControllerDelegate sono facoltativi, quindi è sufficiente dichiarare che si è conformi al protocollo e si deve fare con esso.

Aggiungi questo codice come sotto, puoi vedere l’avviso scomparire.

 @interface viewController : UIViewController  { } @end 

Il protocollo di UIImagePickerController e UINavigationController deve essere aggiunto nell’interfaccia, questo può rendere invisibile l’avviso.