2015-07-19 11 views
10

Ecco la piena errore:imagePickerController: didFinishPickingMediaWithInfo conflitti con metodo requisito opzionale in protocollo 'UIImagePickerControllerDelegate'

Objective-C method 'imagePickerController:didFinishPickingMediaWithInfo:' provided by method 'imagePickerController(_ :didFinishPickingMediaWithInfo:)' conflicts with optional requirement method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' in protocol 'UIImagePickerControllerDelegate'

Essa si verifica il primo di questa funzione nel mio file ViewController.swift:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]){ 
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
     ImageView.contentMode = .ScaleAspectFit 
     ImageView.image = pickedImage 
    } 

    dismissViewControllerAnimated(true, completion: nil) 
} 

Sto cercando di seguire questo tutorial: http://www.codingexplorer.com/choosing-images-with-uiimagepickercontroller-in-swift/

dal metodo di errore, ho capito che esiste un metodoFinishPick ingMediaWithInfo che sta ricevendo dalla classe base imagePickerController e non mi piace che sto provando a sovrascriverlo. Ma questo è tutto ciò che so. Tutte le funzioni di imagePickerController che trovo online assomigliano a questo. Che cosa sto facendo di sbagliato?

Sto usando Xcode 7, se questo fa la differenza. ]

Screenshot 1

risposta

21

La testa funzionamento corretto è:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
    <#code#> 
} 

Annotare il String anziché NSObject nella dichiarazione del dizionario informazioni.

Non sono sicuro del motivo per cui i documenti dicono che è necessario scrivere NSObject, ma è String corretto.

Se si implementano metodi di protocollo, si consiglia di utilizzare il completamento automatico di Xcode per assicurarsi che non si verifichino problemi di questo tipo.

enter image description here

Sono sicuro dove Xcode ottiene che il completamento automatico da ma sembra essere sempre in sintonia con il compilatore vero e proprio, che alla fine è l'unica cosa che si deve preoccupare, piuttosto che alcuni documenti su Apple Online ! Soprattutto nei periodi in cui i quadri sono in costante cambiamento e anche il linguaggio stesso è in fase di sviluppo.

+0

La tua risposta ha risolto il problema, anche se il completamento automatico di XCode 8 lo ha causato, quindi anche il completamento automatico può essere sbagliato. Vedere la mia risposta di seguito – n13

+0

Swift 3: 'func imagePickerController (_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]) {' –

4

Se stai usando Xcode 7, potrebbe essere targeting iOS 9, poi, in cui la firma del metodo cambiato leggermente da:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { 

a:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 

Il NSObject è cambiato a String.

In Swift 3 è cambiato in

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) 
0

Di seguito è riportato il formato del didFinishPickingMediaWithInfo delegato del UIImagePickerController:

public func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) 

Nel vostro caso d'uso String invece di NSObject in parametro di funzione.

Screenshot 1

0

ho avuto questo problema scrivendo una proroga per UIImagePickerControllerDelegate in XCode 8

XCode 8 Completamento automatico produce una firma del metodo con una sottolineatura per il primo parametro. Questo crea un errore di segmentazione nel compilatore Swift. La rimozione del carattere di sottolineatura risolve il problema.

// CRASH SegFault 11 
@objc protocol MyDelegate: UIImagePickerControllerDelegate { 

} 
extension MyDelegate { 
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     // code 
    } 
} 


// DOESN'T CRASH 
@objc protocol MyDelegate: UIImagePickerControllerDelegate { 

} 

extension MyDelegate { 
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     // code 
    } 
} 
Problemi correlati