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.