ios - imagePickerController: didFinishPickingMediaWithInfo entra en conflicto con el método de requisitos opcionales en el protocolo ''UIImagePickerControllerDelegate''
swift ios8 (4)
Aquí está el error completo:
Método Objective-C ''imagePickerController: didFinishPickingMediaWithInfo:'' proporcionado por el método ''imagePickerController (_: didFinishPickingMediaWithInfo :)'' entra en conflicto con el método de requisitos opcional ''imagePickerController (_: didFinishPickingMediaWithInfo :)'' en el protocolo ''UIImagePickerControllerDelegate''
Ocurre en la primera de esta función en mi archivo 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)
}
Estoy intentando seguir este tutorial: http://www.codingexplorer.com/choosing-images-with-uiimagepickercontroller-in-swift/
del método de error, deduzco que hay un método didFinishPickingMediaWithInfo que está obteniendo de la clase base de imagePickerController y no me gusta que intente sobreescribirlo. Pero eso es todo lo que sé. Todas las funciones de imagePickerController que encuentro en línea se ven así. ¿Qué estoy haciendo mal?
Estoy usando Xcode 7, si eso hace la diferencia. ]
El encabezado correcto de la función es:
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
<#code#>
}
Observe la String
lugar de NSObject
en la declaración del diccionario de información.
No estoy seguro de por qué los documentos dicen que debe escribir NSObject
, pero String
es el correcto.
Si implementa algún método de protocolo, le recomendaría usar la autocompleción de Xcode para asegurarse de que no se encuentre con problemas como este.
No estoy seguro de dónde obtiene Xcode la autocompletación, pero parece que siempre está sincronizado con el compilador real, que al final es lo único de lo que tienes que preocuparte más que de algunos documentos de Apple en línea. Especialmente en momentos en que los marcos cambian constantemente e incluso el propio lenguaje está en desarrollo.
A continuación se muestra el formato del delegado didFinishPickingMediaWithInfo de UIImagePickerController:
public func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
En su caso use String en lugar de NSObject en el parámetro de la función.
Tuve este problema escribiendo una extensión para UIImagePickerControllerDelegate en XCode 8
XCode 8 Autocomplete produce una firma de método con un guión bajo para el primer parámetro. Esto crea una falla de segmentación en el compilador Swift. Eliminar el guión bajo soluciona el 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
}
}
Si está utilizando Xcode 7, es posible que tenga como objetivo iOS 9, en el cual la firma del método cambió ligeramente de:
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
a:
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
El objeto NSObject
ha cambiado a String
.
En Swift 3 cambió a
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])