28

Ho aggiunto un UIImagePickerController a UIViewController. Ho anche assegnato lo UIImagePickerControllerDelegate a quello UIViewController.iPhone - UIImagePickerControllerDelegate inheritance

Quando eseguo la seguente linea,

myPicker.delegate = self; 

Xcode mi doni con il seguente messaggio:

avvertimento: l'assegnazione a id dal tipo incompatibile 'RootViewController'

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

Quindi, devo aggiungere entrambi i protocolli allo UIViewController quando aggiungo uno UIImagePickerController?

Se la UIImagePickerController è una sottoclasse di UINavigationController come indicato nella documentazione, non dovrebbe essere automatico? Perché devo aggiungere il protocollo delegato di un genitore e non solo il protocollo UIImagePickerControllerDelegate?

È un errore o mi manca qualcosa?

risposta

61

Come si è notato, UIImagePickerController eredita da UINavigationController. Utilizza comunque la stessa proprietà delegate e non dichiara un (ipotetico) "imagePickerDelegate" autonomo, 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).

Il design dell'API è un po 'discutibile qui a mio parere, 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.

+1

è illogico e rompe il buon senso, ei documenti, come sempre, sono vaghi come l'inferno - ma sospettavo che il problema fosse qualcosa del genere. Comunque grazie! – SpaceDog

33

Aggiungere questo codice come di seguito, è possibile vedere l'avviso scomparire.

@interface viewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> { } 
@end 

Il protocollo di UIImagePickerController e UINavigationController deve essere aggiunto nella vostra interfaccia, questo può rendere l'avvertimento invisibile.

+0

Grazie per avermi aiutato .. – Shivaay

+0

Grazie mi ha aiutato molto e risolto il problema velocemente – Rinku