"Das Erstellen eines Bildformats mit einem unbekannten Typ ist ein Fehler" mit UIImagePickerController

76

Bei der Auswahl eines Bildes aus der Bildauswahl in iOS 10 Swift 3 wird eine Fehlermeldung angezeigt: Creating an image format with an unknown type is an error

 func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {

    imagePost.image = image
    self.dismiss(animated: true, completion: nil)
}

Das Bild wird nicht ausgewählt und aktualisiert. Ich benötige Hilfe oder Vorschläge, um zu wissen, ob die Syntax oder etwas in Bezug auf diese Methode in iOS10 oder Swift 3 geändert wurde oder ob es eine andere Möglichkeit gibt, dies zu tun.

Jeet
quelle
8
Ändern Sie es von AnyObject zu AnydidFinishPickingMediaWithInfo info: [String : Any]
Leo Dabus
2
Sie sollten Xcode es einfach für Sie automatisch vervollständigen lassen. Die Methode, die Sie verwenden, ist meiner Meinung nach veraltet
Leo Dabus
1
Danke Leo in der Tat ein hilfreicher Kommentar.
Jeet
5
das gleiche Problem hier und String: Jeder scheint nicht zu helfen
TheeBen
1
Funktioniert immer noch nicht . Ich benutze Version 8.0 (8A218a)
Kegham K.

Antworten:

28

Der unten genannte Code hat das Problem für mich gelöst -

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        imagePost.image = image
    } else{
        print("Something went wrong")
    }

    self.dismiss(animated: true, completion: nil)
}
Jeet
quelle
21
Dies löst das Problem für mich nicht. Ich habe die Funktion aktualisiert und erhalte immer noch sofort die Fehlermeldung, wenn diese Funktion aufgerufen wird. Und die Verwendung von UIImage funktioniert danach nicht mehr.
Tim
3
@ Tim Ich bekomme immer noch den Fehler, aber der Zugriff auf das Bild funktioniert gut.
MobileVet
1
@jeetendra Dies löst mein Problem, gibt mir aber dennoch eine Warnung "Die Instanzmethode (didFinishPickingMediaWithInfo) entspricht fast der optionalen Anforderung." Wenn ich vor der Funktion private oder nonobj hinzufüge, ist die Warnung weg, aber die Methode wird nicht aufgerufen.
Arpit Dhamane
Diese Lösung funktioniert bei XCode 8 und Swift 3 nicht. Ich verwende ein iOS10-Gerät.
Machado
1
Obwohl dies mir geholfen hat, das Problem zu lösen, dass das Bild nicht angezeigt wird, wird der Fehler weiterhin in der Konsole angezeigt. Trotzdem danke.
Arjun Kalidas
11

Denken Sie daran, einen Delegaten zu sich selbst hinzuzufügen

let picker = UIImagePickerController()
picker.delegate = self // delegate added
Roberto Gutierrez
quelle
Ha, du hast mich gerettet. Xcode 7 würde ohne die Delegiertenzuweisung kompilieren und ordnungsgemäß funktionieren ... verrückt.
MobileVet
10

Der folgende Code hat das Problem gelöst:

Wenn der Benutzer Änderungen am ausgewählten Bild vornimmt, ziehen Sie nur dieses Bild, andernfalls ziehen Sie die Originalbildquelle ohne Änderungen und schließen Sie schließlich den Bildauswahl-Ansichts-Controller.

public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]){
    if let image = info[UIImagePickerControllerEditedImage] as? UIImage {
        imageView.image = image
    }
    else if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        imageView.image = image
    } else{
        print("Something went wrong")
    }

    self.dismiss(animated: true, completion: nil)
}
Keerthi Chinivar
quelle
2
Willkommen bei Stack Overflow! Nur-Code-Antworten sind für sich genommen nicht sehr nützlich. Es würde helfen, wenn Sie einige Details hinzufügen könnten, die erklären, wie / warum es die Frage beantwortet
Jeet
Dies sollte die richtige Antwort sein. Funktioniert einwandfrei.
user3286381
7

Wenn Sie die Bearbeitung des Bildes zulassen, imageController.allowsEditing = truemüssen Sie zuerst das bearbeitete Bild abrufen:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
    picker.dismissViewControllerAnimated(true, completion: nil)

    if let image = info[UIImagePickerControllerEditedImage] as? UIImage {
        imagePost.image = image
    } else if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        imagePost.image = image
    } else {
        imagePost.image = nil
    }
}
oyalhi
quelle
Ich habe Ihre Antwort implementiert, erhalte aber immer noch den Fehler. Könnten Sie bitte meine Frage stackoverflow.com/questions/50189732
bibscy
5

Die von Jeetendra Choudhary akzeptierte Lösung funktioniert. Obwohl in Xcode 8 mit Swift 3 festgestellt wurde, dass eine Warnung generiert wird: Instance method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' nearly matches optional requirement 'imagePickerController(_:didFinishPickingMediaWithInfo:)' of protocol 'UIImagePickerControllerDelegate'

Geben Sie hier die Bildbeschreibung ein

und schlägt vor, entweder @nonobjc oder ein privates Schlüsselwort hinzuzufügen, um die Warnung stumm zu schalten. Wenn Sie die Warnung mithilfe dieser Vorschläge stumm schalten, funktioniert die Lösung jedoch nicht mehr.

Ashildr
quelle
Vielen Dank für die Klarstellung sinnvoll.
Jeet
1
Das Problem ist das "AnyObject" - die korrekte Swift 3-Signatur verwendet "Any". Verwenden Sie nicht die von Xcode vorgeschlagenen Lösungen, um die Warnung stumm zu schalten.
Zig
5

Ich habe festgestellt, dass die Standardbilder in der Fotobibliothek dieses Problem beheben können. Wenn Sie ein Bild von Ihrem Computer auf den Simulator ziehen und auswählen. Dieses Problem ist gelöst

Changmeng Chen
quelle
3

Laut Abdurohmans Antwort ändere ich meinen Code und löse das Problem, danke.

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage

    photoImageView.image = selectedImage

    // Dismiss the picker.
    dismiss(animated: true, completion: nil)
}
edenPan
quelle
Das ist der einzige Code, der in Swift 3.0 für mich funktioniert hat. Vielen Dank!
Fraxool
2

Fügen Sie dies zu viewDidload () hinzu

imagepicker.delegate = self
Ali Adil
quelle
1

Fügen Sie "_" in die Funktionsparameter ein.

von

func imagePickerController(picker: UIImagePickerController ...

zu

func imagePickerController(_ picker: UIImagePickerController ...
Woongbi Kim
quelle
1

Das hat bei mir funktioniert:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        imageView.image = image
        self.dismiss(animated: true, completion: nil)
    }
}
Jason Crawford
quelle
Willkommen bei Stack Overflow! Nur-Code-Antworten sind für sich genommen nicht sehr nützlich. Es würde helfen, wenn Sie einige Details hinzufügen könnten, die erklären, wie / warum es die Frage beantwortet
Jeet
1

Wenn dies jemandem hilft, ist dies passiert, als ich UIImageView unterklassifiziert habe, um eine abgerundete Ansicht zu erstellen. Es passierte auch, als ich die folgende Zeile in viewDidLoad () hinzufügte.

imageView.layer.cornerRadius = self.imageView.frame.size.width / 2

Am Ende habe ich die Zeile in viewWillLayoutSubViews hinzugefügt und es hat funktioniert. Weitere Informationen finden Sie hier:

clipsToBounds führt dazu, dass UIImage in iOS10 und XCode 8 nicht angezeigt wird

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

         let image = info[UIImagePickerControllerOriginalImage] as? UIImage
        self.dismiss(animated: true, completion: nil)
        self.imageTook.image = image
    }
Ramanaraynan
quelle
4
Willkommen bei Stack Overflow! Nur-Code-Antworten sind für sich genommen nicht sehr nützlich. Es wäre hilfreich, wenn Sie einige Details hinzufügen könnten, die erklären, wie / warum die Frage beantwortet wird.
SiHa
2
Dies löste mein Problem. Aber können Sie den Grund erklären?
Krishnadas PC
1

Ändern Sie didFinishPickingMediaWithInfo info: [String : AnyObject]zudidFinishPickingMediaWithInfo info: [String : Any]

evan
quelle
1

Für Xcode 8.1 mit Swift 3, nachdem Sie die Delegate-Methode wie folgt geändert haben

ändere dein

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {

    imagePost.image = image
    self.dismiss(animated: true, completion: nil)
}

Funktion zu

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

    {


imagePost.image = info[UIImagePickerControllerOriginalImage] as? UIImage
 picker.dismiss(animated: true, completion: nil)

}

Ich habe vergessen, UINavigationControllerDelegate zusammen mit UIImagePickerControllerDelegate hinzuzufügen

class ViewController:UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate

Sie hätten am Anfang gerne eine Variable hinzugefügt

var imagePicker = UIImagePickerController ()

und Setzen von delegate und Aufrufen einer Funktion in viewdidload () als

 imagePicker.delegate = self
 viwImagePick()

Erklären Sie dann diese Funktion als

  //ImagePicker
    func viwImagePick(){


        let alert = UIAlertController(title: nil, message: "Choose your source", preferredStyle: UIAlertControllerStyle.alert)

        alert.addAction(UIAlertAction(title: "Camera", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in
            print("Camera selected")
            self.openCamera()

            //Code for Camera
            //cameraf
        })
        alert.addAction(UIAlertAction(title: "Photo library", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in
            print("Photo selected")
            self.openGallary()

            //Code for Photo library
            //photolibaryss
        })


        self.present(alert, animated: true, completion: nil)
           }



    func openCamera()
    {
        imagePicker.sourceType = UIImagePickerControllerSourceType.camera
        if UIDevice.current.userInterfaceIdiom == .phone
        {
            self.present(imagePicker, animated: true, completion: nil)
        }
        else
        {
            let popover = UIPopoverController(contentViewController: imagePicker)

            popover.present(from: profileImgViw.frame, in: self.view, permittedArrowDirections: UIPopoverArrowDirection.any, animated: true)

        }
    }

    func openGallary()
    {
        imagePicker.sourceType = UIImagePickerControllerSourceType.savedPhotosAlbum
        if UIDevice.current.userInterfaceIdiom == .phone
        {
            self.present(imagePicker, animated: true, completion: nil)
        }
        else
        {
           let popover = UIPopoverController(contentViewController: imagePicker)

            popover.present(from: profileImgViw.frame, in: self.view, permittedArrowDirections: UIPopoverArrowDirection.any, animated: true)


        }
    }

Jetzt wird das Bild der Bildansicht aus der Bibliothek hinzugefügt

Dinesh Kumar
quelle
Bitte bearbeiten Sie die Antwort, um zu erklären, wie dies mit der tatsächlichen Frage zusammenhängt. Es ist nicht ganz klar aus Ihrer Erklärung.
Jeet
1

Ich denke, Sie vermissen eine Verbindung zwischen photoImageView und dem Bild.

Schauen Sie sich meine Screenshots unten an:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Mein Mai
quelle
Warum 2 mit dem gleichen Inhalt antworten?
22.
1

Ich denke, Sie vermissen eine Verbindung zwischen photoImageView und dem Bild.

Schauen Sie sich meine Screenshots unten an:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Viel Glück!

Mein Mai
quelle
1
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {
        imgViewPhoto.image = image
    } else{
        print("Something went wrong")
    }

    picker.dismiss(animated: true, completion: nil)

}
DMP_2016
quelle
0

Stellen Sie sicher, dass Sie auch den UINavigationControllerDelegateDelegierten einbeziehen. Dies löste das Problem für mich.

Jordi Bruin
quelle
0

versuchen Sie es unten

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    print("image selected");
    let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImag
    self.dismiss(animated: true, completion: nil)
   UIImg.image = selectedImage
}
mzonerz
quelle
0

Das hat bei mir funktioniert. Kopieren Sie es einfach und fügen Sie es genau ein.

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    // The info dictionary contains multiple representations of the image, and this uses the original.
        let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage

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

    // Dismiss the picker.
    dismiss(animated: true, completion: nil)
}
thepiranha
quelle
5
Willkommen bei Stack Overflow! Nur-Code-Antworten sind für sich genommen nicht sehr nützlich. Es wäre hilfreich, wenn Sie einige Details hinzufügen könnten, die erklären, wie / warum die Frage beantwortet wird
Jeet
0

Nachdem ich das Bild von didFinishPickingMediaWithInfo erhalten hatte, rief ich an:

func prepareImageForSaving(image:UIImage) {
    // create NSData from UIImage
    guard let imageData = UIImageJPEGRepresentation(image, 1) else {
        // handle failed conversion
        print("jpg error")
        return
    }

    self.saveImage(imageData: imageData as NSData)
}

func saveImage(imageData: NSData) {
    imageDatas = imageData
}

um es im NSData-Format zu speichern.

Die Konsole warnte mich immer noch vor "[Allgemein] Das Erstellen eines Bildformats mit einem unbekannten Typ ist ein Fehler", aber zumindest wird meine imageView auf das ausgewählte Bild aktualisiert, anstatt das vorherige von viewDidLoad anzuzeigen.

Jackson Gan
quelle
0

// Bildauswahl mit Sammlungsansichtsklasse ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UICollectionViewDataSource, UICollectionViewDelegate {

@IBOutlet var img: UIImageView!

@IBOutlet weak var collview: UICollectionView!

var image = NSMutableArray()


let imgpkr = UIImagePickerController()

override func viewDidLoad() {
    super.viewDidLoad()

    imgpkr.delegate = self
}




@IBAction func btnselect(_ sender: UIButton) {


    imgpkr.allowsEditing = true // false
    imgpkr.sourceType = .photoLibrary
    imgpkr.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
    present(imgpkr, animated: true, completion: nil)

}


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

    let choose = info[UIImagePickerControllerOriginalImage]as!UIImage
    let edit = info[UIImagePickerControllerEditedImage]as!UIImage

    img.contentMode = .scaleAspectFit
    img.image = edit

    //MARK:- Add image in collview

    image.add(edit)
    collview.reloadData()

    dismiss(animated: true, completion: nil)

}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {

    dismiss(animated: true, completion: nil)
}

//MARK:- Collection View


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    return image.count

}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let cell = collview.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)as! CollectionViewCell1

    cell.img1.image = image.object(at: indexPath.item)as! UIImage

    return cell



}
Hiren
quelle
-1

Für mich bekam ich den Fehler:

"Schwerwiegender Fehler: unerwartet null gefunden ..."

wenn Sie imagein imagepicker auswählen.

Um das Problem zu umgehen, habe ich die Steckdose für die imageViewerneut erstellt.

Haider Malik
quelle