Estoy usando Apple Swift iOS Tutorial. Que es tirar un error,

No subíndice un valor de tipo ‘[String : Cualquier]’ con un índice de tipo ‘UIImagePickerController.InfoKey’

La función que se define a continuación.

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

    //The info dictionary may contain multiple representations of the image. You want to use the original.
    guard let selectedImage = info[UIImagePickerControllerOriginalImage] as? UIImage else {
        fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
    }

    //Set photoImageView to display the selected image.
    photoImageView.image = selectedImage

    //Dismiss the picker.
    dismiss(animated: true, completion: nil)
}

Estoy usando la Versión de Xcode 10.0 beta 3, que incluye Swift 4.2.

Me gustaría entender cómo recorrer la documentación para entender lo que podría haber cambiado o roto.

  • Me di cuenta de que otra línea, más adelante en este tutorial también tiró un error – button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(button:)), for: .touchUpInside). En el caso de que otros tienen el mismo problema, yo era capaz de solucionarlo mediante la adición de @objcMembers a la derecha en el comienzo de la línea de clase, como este: @objcMembers class RatingControl: UIStackView {. Consulte hackingwithswift.com/example-code/language/…
InformationsquelleAutor drobati | 2018-07-14

8 Comentarios

  1. 103

    La firma del método ha cambiado en Swift 4.2

    func imagePickerController(_ picker: UIImagePickerController, 
      didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])

    y usted tiene que escribir

    guard let selectedImage = info[.originalImage] as? UIImage else {
        fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
    }

    Usted puede averiguar tales cambios de terminología sí mismo mediante la lectura de la documentación o comentando el método completo, vuelva a escribir los primeros caracteres y el uso de la finalización de código.

    • Genial, que ha despejado los errores en el IDE. Como el OP me empezó a hacer iOS y siguiendo el mismo tutorial.
    • ¿Alguien sale un error como este «‘UIImage?’ no es convertible ‘UIImage'» en «como?» ?
  2. 23

    Estoy siguiendo también el mismo tutorial, el código actualizado se parece a esto:

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    
        //The info dictionary may contain multiple representations of the image. You want to use the original.
        guard let selectedImage = info[.originalImage] as? UIImage else {
            fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
        }
    
        //Set photoImageView to display the selected image.
        photoImageView.image = selectedImage
    
        //Dismiss the picker.
        dismiss(animated: true, completion: nil)
    }
    • He utilizado este y resolver el problema Gracias
  3. 11

    Swift 5

    Con la última versión de swift 4 o 5 el delegado método es la siguiente, se debe trabajar

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        //Code here
    }

    Y uso,

    guard let selectedImage = info[.editedImage] as? UIImage else {
    
    }
    
    
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        guard let selectedImage = info[.editedImage] as? UIImage else {
    
        }
    }
  4. 9

    Uso como esta,

    guard let selectedImage = info[UIImagePickerController.InfoKey.originalImage.rawValue] as? UIImage else {
            fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
    }
  5. 6

    En Swift 4 y 5, así:

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    
        guard let selectedImage = info[.editedImage] as? UIImage else {
            fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
        }
    
        self.myImageView.image = selectedImage
    
        picker.dismiss(animated: true, completion: nil)
    }
    • No hay ninguna diferencia entre Swift 4 y 5
  6. 2

    También estoy siguiendo el tutorial. Se está trabajando después de cambiar a la siguiente.

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    
        //The info dictionary may contain multiple representations of the image. You want to use the original.
        guard let selectedImage = info[.originalImage] as? UIImage
            else {
            fatalError("Expected a dictionary containing an image, but was provided the following: \(info)")
        }
    
        //Set photoImageView to display the selected image.
        photoImageView.image = selectedImage
    
        //Dismiss the picker.
        dismiss(animated: true, completion: nil)
    }

    Estoy usando XCode 11 y Swift 5.

  7. 1

    Método ha cambiado un poco en Swift 4.2.

    Primera inicializar estas dos variables:

    var imagePicker = UIImagePickerController()
    var pickedImageProduct = UIImage()
    
    extension yourViewController: UIImagePickerControllerDelegate,UINavigationControllerDelegate{
    //create an IBAction to access Camera
        @IBAction func accessCameraBtn(_ sender: UIButton) {
            imagePicker.delegate = self
            imagePicker.sourceType = UIImagePickerController.SourceType.camera
            self.present(imagePicker, animated: true, completion: nil)
        }
    //create an IBAction to access Gallery
        @IBAction func accessGalleryBtn(_ sender: UIButton) {
            imagePicker.delegate = self
            imagePicker.sourceType = UIImagePickerController.SourceType.photoLibrary
            self.present(imagePicker, animated: true, completion: nil)
        }
    //Final step put this Delegate    
        func imagePickerController(_ picker: UIImagePickerController,
                                   didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    
            guard let selectedImage = info[.originalImage] as? UIImage else {
               Print("Error: \(info)")
            }
    
                pickedImageProduct = selectedImage
    
            dismiss(animated: true, completion: nil)
         }
        func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    
            dismiss(animated: true, completion: nil)
        }
    
    }
    • El método ha sido cambiado por la tarde, creo que en 4.0 o tal vez incluso antes.
  8. 1

    En Swift 4.2 se puede escribir la función como:

        func photoLib()
        {
            //opens Photo Library, call the function in a @IBAction func
            let myPickerController = UIImagePickerController()
            myPickerController.delegate = self;
            myPickerController.sourceType = 
            UIImagePickerController.SourceType.photoLibrary
            myPickerController.allowsEditing = true
            present(myPickerController, animated: true)
        }
    
    
        func imagePickerController(_ picker: UIImagePickerController, 
        didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        picker.dismiss(animated: true)
    
        guard let image = info[.editedImage] as? UIImage else {
            print("No image found")
            photoLabel.text = "Photo Not Found"
            return
        }
    }
    • gracias por la sugerencia

Dejar respuesta

Please enter your comment!
Please enter your name here