PhotoPicker-Erkennungsfehler: Fehlerdomäne = PlugInKit-Code = 13

118

Ich versuche, ein Bild aus der Fotobibliothek in einer UIImageView anzuzeigen

Der vollständige Fehler ist:

2017-06-09 21: 55: 59.063307 + 0200 firstapp2.0 [12873: 1120778] PhotoPicker-Erkennungsfehler: Fehler Domain = PlugInKit Code = 13 "Abfrage abgebrochen" UserInfo = {NSLocalizedDescription = Abfrage abgebrochen}

Mein Code ist unten enthalten:

import UIKit

class ViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate{

    @IBOutlet weak var pic: UIImageView!
    @IBOutlet weak var text: UILabel!

    var chosenImage : UIImage!

    override func viewDidLoad() {
        super.viewDidLoad()        
        pic.isUserInteractionEnabled = true;
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [AnyHashable: Any]) {
        var chosenImage = info[UIImagePickerControllerEditedImage]
        self.pic!.image = chosenImage as! UIImage
        picker.dismiss(animated: true, completion: nil)
    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }

    @IBAction func tap(_ sender: Any) {        
        self.text.text = "Kreason"
        let imagePicker = UIImagePickerController()    
        imagePicker.delegate = self        
        imagePicker.sourceType = UIImagePickerControllerSourceType.photoLibrary
        imagePicker.allowsEditing = false    
        self.present(imagePicker, animated: true, completion: nil)
    }
}
Kreason Naidoo
quelle
11
Ich habe den gleichen Fehler bekommen. Verwenden Sie Xcode 9 Beta, iOS 11?
John
4
Das hat früher funktioniert ... und dann hat mir iOS 11 Beta 4 plötzlich diesen Fehler gegeben. So seltsam.
user2153553
2
Ich erhalte den gleichen Fehler und meine Implementierung ist in obj-c. Diese Fehlermeldung kann nicht mit der Typumwandlung des in der UIImagePicker-Delegatenmethode in Objective-C zurückgegebenen Info-Wörterbuchs verknüpft werden: - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)infoDie Wörterbuchwerte werden in obj-c als ID umgewandelt. Ich habe auch die Autorisierungsanforderung und -behandlung für den Zugriff auf die Fotobibliothek des Benutzers implementiert: Es wird weiterhin die Fehlermeldung angezeigt. Ich habe in der Datei info.plist den Datenschutzeintrag für die Fotobibliothek des Benutzers hinzugefügt.
ValeCocoa
2
Ich erhalte den aktuellen Fehler, der mich jedoch nicht daran hindert, ein Bild aus der Bibliothek
abzurufen
3
Ich habe alle Vorschläge in allen Antworten zusammen ausprobiert , ohne Erfolg.
Nicolas Miari

Antworten:

39

Sie müssen eine explizite Objective-C-Referenz angeben: @objc

@objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
    image = chosenImage
    self.performSegue(withIdentifier: "ShowEditView", sender: self)
    dismiss(animated: true, completion: nil)
}
Robert Deschrijver
quelle
6
Funktioniert bei mir. Ich hatte kürzlich auf Swift 4 und Xcode 9 aktualisiert und dies löste es.
user3144836
3
Funktioniert bei mir. Erforderlich nach der Migration auf Swift 4.0.
Mayankk2308
4
Funktioniert nicht Dieser Fehler trat auf, nachdem ich angerufen hatte dismiss.
Kimi Chiu
Seltsam. Dies hat bei mir funktioniert, aber xcode markiert es als Warnung und erwartet eine Signatur von: `Instanzmethode 'imagePickerController ( : didFinishPickingMediaWithInfo :)' entspricht fast der optionalen Anforderung 'imagePickerController ( : didFinishPickingMediaWithInfo :)' des Protokolls 'UIImagePickerControllerDelegate') : didFinishPickingMediaWithInfo :) 'privat, um diese Warnung zum Schweigen zu bringen `
Dark Castle
@DarkCastle Sie müssen die Funktion in einen extension [your class name]Block außerhalb der Klasse schreiben .
Prometheos II
18

Ich habe diese Lösung gefunden. Wir haben diesen Fehler aufgrund dieser beiden unten genannten Gründe erhalten.

  1. Zuerst müssen wir diese Methode zur Autorisierung aufrufen

Autorisierungscode

func checkPermission() {
  let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus() switch photoAuthorizationStatus {
    case .authorized: print("Access is granted by user")
    case .notDetermined: PHPhotoLibrary.requestAuthorization({
      (newStatus) in print("status is \(newStatus)") if newStatus == PHAuthorizationStatus.authorized { / do stuff here */ print("success") }
    })
    case .restricted: / print("User do not have access to photo album.")
    case .denied: / print("User has denied the permission.")
  }
}
  1. Richtige Art der Methode Aufruf von didFinishPickingMediaWithInfo

Falsch:

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

Richtig

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

Ich hoffe, diese Lösung hilft Ihnen, diesen Fehler zu beheben.

Wenn es für Sie funktioniert, vergessen Sie nicht, es als korrekt zu markieren. Dies hilft anderen, den richtigen Weg zu finden.

user3159598
quelle
Noob PSA: PHPhotoLibrary ist aus Swifts Fotomodul
Braden Holt
Funktioniert nicht Der Fehler tritt auf, nachdem ich Anrufpicker.dismiss(animated: true, completion: nil)
ForceBru
17

Ich habe es gefunden! Es wird versucht, Ihnen mitzuteilen, dass Sie keine Berechtigung für "Fotos" haben#import <Photos/Photos.h> Berechtigung beispielsweise in Objective-C aufnehmen und anfordern.

Ich hoffe, das spart Ihnen Zeit. Ich habe zwei volle Tage damit verbracht, dies zu debuggen!

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
    switch (status) {
        case PHAuthorizationStatusAuthorized:
            NSLog(@"PHAuthorizationStatusAuthorized");
            break;
        case PHAuthorizationStatusDenied:
            NSLog(@"PHAuthorizationStatusDenied");
            break;
        case PHAuthorizationStatusNotDetermined:
            NSLog(@"PHAuthorizationStatusNotDetermined");
            break;
        case PHAuthorizationStatusRestricted:
            NSLog(@"PHAuthorizationStatusRestricted");
            break;
    }
}];

Ich bin sicher, jemand kann Ihnen sagen, wie Sie dasselbe in Swift tun können.

Robert Wohnoutka
quelle
1
Achten Sie darauf, #import <Photos / Photos.h>
Robert Wohnoutka
6
Dies hat mein Problem nicht behoben.
12.
1
Ich erhalte die folgende Meldung in der Konsole "Lesen aus privaten effektiven Benutzereinstellungen. Fehler beim Erkennen von Erweiterungen: Fehler Domain = PlugInKit Code = 13" Abfrage abgebrochen "UserInfo = {NSLocalizedDescription = Abfrage abgebrochen}". Es hat das Problem nicht gelöst.
Biranchi
15

Versuchte einige der Kombinationsantworten ohne großen Erfolg.

Bei Verwendung von Swift 4 musste ich sicherstellen, dass die folgenden zwei Elemente implementiert wurden, um sicherzustellen, dass das Bild ausgewählt und in die Auswahl eingefügt wurde (beachten Sie, dass beim Erkennen von Erweiterungen "[Discovery] -Fehler aufgetreten sind:

Fehler Domain = PlugInKit Code = 13 "Abfrage abgebrochen" UserInfo = {NSLocalizedDescription = Abfrage abgebrochen} "

Die Meldung wird weiterhin in der Konsole angezeigt, hindert Sie jedoch nicht daran, ein Bild hinzuzufügen. Vielleicht ist dies eine Nachricht, die dazu führt, dass der Kommissionierer entlassen wird?

1) Der Beauftragte für die UIImagePickerControllerist (UIImagePickerControllerDelegate & UINavigationControllerDelegate)?so notwendig , um explizit die hinzuzufügen UINavigationControllerDelegateals eines des Protokolls:

class ViewController:UIViewController, UIImagePickerControllerDelegate, 
    UINavigationControllerDelegate { .... }. 

2) Stellen Sie sicher, dass in der info.plist der Privacy - Photo library Usage DescriptionSchlüssel- und String-Wert festgelegt ist.

Natürlich müssen Sie sicherstellen, dass Sie einen erstellen UIImagePickerControllerund seinen Delegaten gleich setzen selfin ViewDidLoad():

class ViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 
    let imagePickerController = UIImagePickerController()
    override func viewDidLoad() {
        super.viewDidLoad()
        imagePickerController.delegate = self
    }
    ...
}
G Reynolds-Titko
quelle
4
Ich habe das alles in meinem Projekt. Trotzdem funktioniert es nicht
Mohamed Lee,
Danke, ich habe es verpasst, einen Delegaten in viewDidLoad () zu setzen
Arshad Shaik
11

Ich habe dieses Problem behoben. Rufen Sie die folgende Funktion in viewdidload oder viewWillAppear oder viewDidAppear auf, um die Berechtigung für Ihre App zu überprüfen.

func checkPermission() {
        let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus()
        switch photoAuthorizationStatus {
        case .authorized:
            print("Access is granted by user")
        case .notDetermined:
            PHPhotoLibrary.requestAuthorization({
                (newStatus) in
                print("status is \(newStatus)")
                if newStatus ==  PHAuthorizationStatus.authorized {
                    /* do stuff here */
                    print("success")
                }
            })
            print("It is not determined until now")
        case .restricted:
            // same same
            print("User do not have access to photo album.")
        case .denied:
            // same same
            print("User has denied the permission.")
        }
    }

Und um die obige Methode zu verwenden, vergessen Sie nicht, import Photosoben in der Klasse hinzuzufügen .

logan.Nguyen
quelle
11

XCODE 10.1 / SWIFT 4.2:

  1. Erforderliche Berechtigungen hinzufügen (andere erwähnt)

  2. Implementieren Sie diese Delegatenfunktion:

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    
        if let pickedImage = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            self.imgView.contentMode = .scaleAspectFit
            self.imgView.image = pickedImage
        }
    
        dismiss(animated: true, completion: nil)
    }
FREITAG
quelle
1
Echte Art der Verwendung von imagePickerController func auf Swift 4x
Samet Sazak
10

* Fehlendes DELEGATE * in Swift 3

In meinem Fall waren alle Einstellungen korrekt:
1 - Delegates (UIImagePickerControllerDelegate, UINavigationControllerDelegate);
2 - Berechtigungen bereits überprüft;
3 - Plist bereits fertig;
4 - Alles, was in diesen Antworten gelesen wurde, habe ich getan;

Aber ich vergaß zu implementieren pickerview.delegate = selfauf viewDidLoad Weil ich Kopieren und einfügen von meinen anderen Viewcontroller und vergessen , dass!

Ich hoffe es hilft jemandem, überprüfen Sie zuerst Ihre KOPIE / PASTE !!!

Daniel Arantes Loverde
quelle
Danke, ich kämpfe seit langen Stunden und ich habe "UINavigationControllerDelegate" verpasst, du hast endlich gespart, danke
Sakthimuthiah
Gerne helfen :)
Daniel Arantes Loverde
8

Dies ist möglicherweise nicht die direkt hilfreichste Antwort - aber hoffentlich hilft es! Ich bin mir zu 99% sicher, dass diese spezielle Fehlermeldung Sie nicht auf das eigentliche Problem hinweist. Ich verbrachte Stunden damit, mir wegen genau dieses Problems die Haare auszureißen.

1) Ich hatte die Berechtigung zum Drucken von Fotos auf der Konsole, als ich meine Auswahl startete, 2) ich konnte einfach genug navigieren und ein Foto auswählen, und 3) als ich mich nach dem Schließen der Auswahl wieder zu meiner Ansicht zurückzog, mein Schaltflächenbild wurde nicht mit dem neuen Foto aktualisiert ... und der einzige Hinweis, den ich auf das Problem hatte, war genau die gleiche Fehlermeldung, die Sie erhalten.

Es stellte sich heraus, dass ich ein Platzhalterbild in ViewWillAppear anstelle von ViewDidLoad fest codiert habe. Jedes Mal, wenn der Picker entlassen wurde, rief er ViewWillAppear auf und ersetzte mein ausgewähltes Bild durch mein fest codiertes Bild. Ich habe dieses Problem behoben und sicher genug - jetzt funktioniert alles einwandfrei ... und ich sehe diese Fehlermeldung immer noch jedes Mal, wenn ich vom Picker zurückkomme.

Ich empfehle, nach einem anderen Ort als dem ImagePicker für Ihr Problem zu suchen, und Sie werden es wahrscheinlich finden.

Levi Lais
quelle
7

Wenn Sie dies noch nicht getan haben, versuchen Sie dies .

Produkt> Schema> Schema bearbeiten> Umgebungsvariablen OS_ACTIVITY_MODE: disable

Es löst mein Problem.

Changnam Hong
quelle
23
Dies unterdrückt die Fehlermeldungen, behebt jedoch nicht deren Ursache. Es unterdrückt auch andere Systemmeldungen und alles von NSLog.
John Montgomery
6
Dies löst das Problem nicht, sondern macht es nur unsichtbar. Sehr schlechte Praxis.
Zeeshan
Dies ist das Äquivalent zum Verstecken Ihres Schmutzes unter dem Teppich tbh
shiv
7

Dies behebt das Problem in Swift 4:

Ändern Sie den folgenden Code

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

dazu:

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


Swift 4.2 update:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){}
user2153553
quelle
Mein Fehler sah ungefähr so ​​aus: Fehler beim Erkennen von Erweiterungen: Fehler Domain = PlugInKit Code = 13 "Abfrage abgebrochen" UserInfo = {NSLocalizedDescription = Abfrage abgebrochen} Und dies löste mein Problem, obwohl ich nicht sprechen kann, wenn dies dem OP hilft . Danke :)
Agrippa
6

Ich habe die gleiche Meldung erhalten, als ich versucht habe, einen anderen Controller aus dem Picker-Rückruf zu präsentieren imagePickerController. Die Lösung, die für mich funktioniert hat, bestand darin, meinen Code innerhalb des Abschlussrückrufs von der Picker-Entlassungsmethode zu verschieben

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        picker.dismiss(animated: true) {
            if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
                let cropController:CropViewController = CropViewController(croppingStyle: .circular, image: pickedImage)
                cropController.delegate = self
                self.present(cropController, animated: true, completion: nil)
            }
        }
    }
Mario Vasile
quelle
Tolle Antwort, du hast mir Zeit gespart 👍🏼
Coder ACJHP
Hat wunderbar funktioniert! Denken Sie, dies ist der richtige Weg, um mit den Auswahlfehlern in Swift 4.x umzugehen.
Shiv
4

Stellen Sie sicher, dass Sie beide Unterklassen haben : UIImagePickerControllerDelegate, UINavigationControllerDelegate.

Denken Sie auch daran, den Delegaten festzulegen:

let picker = UIImagePickerController()
picker.allowsEditing = true
picker.sourceType = .photoLibrary
picker.delegate = self  //Don't forget this line!
self.present(picker, animated: true, completion: nil)

Credits zu dieser Quelle .

Ryan
quelle
picker.delegate = self - war mein Fall! Danke dir.
Alexey Chekanov
4

Die Lösung für dieses Problem zu finden, hat mich für immer gekostet. Es sieht so aus, als ob das Problem darin besteht, dass die Funktion imagePickerController des UIImagePickerControllerDelegate nicht gefunden werden kann. Wenn Sie den Delegaten richtig eingestellt haben und er nach dem Upgrade auf Swift 4 nicht mehr funktioniert, besteht das Problem wahrscheinlich darin, dass Sie ihn mit @objc, das seit Swift 4 erforderlich ist, nicht für Objective-C zugänglich gemacht haben.

Es muss sein:

@objc func imagePickerController (...

anstatt

func imagePickerController(...
Apfelsaft
quelle
Es schafft FehlerObjective-C method 'imagePickerController:didFinishPickingMediaWithInfo:' provided by method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' conflicts with optional requirement method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' in protocol 'UIImagePickerControllerDelegate'
Nico Neill
Genau so kann man das beheben!
Maria Ortega
@NicoNeill hast du die Funktion in einen extensionBlock eingefügt ?
Prometheos II
4

Es wurde behoben, indem beim Einstellen des Bildes eine Verzögerung von 1 Sekunde eingestellt wurde.

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

    if let image = info[UIImagePickerControllerOriginalImage] as? UIImage {

        picker.dismiss(animated: false, completion: nil)
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: {
            self.discussionImage.image = image
        })
    }
}
Dharmesh Kheni
quelle
3

Stellen Sie sicher, dass Sie internal funcam Anfang hinzufügen und dann nach der Klammer Kleinbuchstaben einfügen ( _ picker: UIImagePickerController…und wechseln Sie dann von AnyObjectzu Any]…
Überprüfen Sie den folgenden Code:

internal func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {

        userPhoto.image = pickedImage

    }

    self.dismiss(animated: true, completion: nil)
}
Sabino Diaz
quelle
3

Das hat mich verblüfft, aber die Antwort unter dem folgenden Link hat bei mir funktioniert. Der Fehler ist verschwunden und das Bild wird wie erwartet angezeigt

Wie eine der obigen Antworten muss man (_ picker...aber auch @objcvor der Funktion haben.

@objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
...
}

https://forums.developer.apple.com/thread/82105

EGibson
quelle
2

Dies löste meinen Fehler:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage
    addPhotoBtn.setImage(pickedImage, for: .normal)
    dismiss(animated: true, completion: nil)


}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    dismiss(animated: true, completion: nil)

}
iOS Entwickler
quelle
2

Bitte überprüfen Sie die folgenden Schritte:

  1. Fotos importieren
  2. Hat Zugriff auf das Album:

    func authorizeToAlbum(completion:@escaping (Bool)->Void) {
    
    if PHPhotoLibrary.authorizationStatus() != .authorized {
        NSLog("Will request authorization")
        PHPhotoLibrary.requestAuthorization({ (status) in
            if status == .authorized {
                DispatchQueue.main.async(execute: {
                    completion(true)
                })
            } else {
                DispatchQueue.main.async(execute: {
                    completion(false)
                })
            }
        })
    
    } else {
        DispatchQueue.main.async(execute: {
            completion(true)
        })
    }
    }
  3. Präsentieren Sie UIImagePickerController

    self.authorizeToAlbum { (authorized) in
        if authorized == true {
            let picker = UIImagePickerController()
            picker.delegate = self
            picker.allowsEditing = false
            picker.sourceType = .photoLibrary
    
            self.present(picker, animated: true, completion: nil)
        }
    }
  4. Stellen Sie im Schlüsselschritt sicher, dass die Delegatenmethode genau wie folgt ist

    // MARK: - UIImagePickerControllerDelegate Methods
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
        self.pickedImage = pickedImage
        if let finalImage = handleImage(originalImage: self.pickedImage!, maskImage: self.maskImage!) {
            self.imageView.image = finalImage
        }
    }
    
    dismiss(animated: true, completion: nil)
    }
xuzepei
quelle
2

Dies ist, was ich getan habe und es hat mein Problem gelöst.

  • füge @objc hinzu
  • intern hinzufügen
  • füge _ vor imagePicker hinzu
  • Stellen Sie sicher, dass Sie Any und nicht AnyObject verwenden

Hoffe das hilft!

FreitDev
quelle
Hmm, internalist die Standardeinstellung; Ich frage mich, welchen Unterschied es macht, es zu spezifizieren ...
Nicolas Miari
2

In meinem Fall wurde dieser Fehler angezeigt, weil ich einen Bildauswahl-Controller präsentierte, ohne vorher zu überprüfen, ob der Benutzer Zugriff auf Bilder gewährt hatte. An anderer Stelle in meinem Code hatte der Benutzer die Erlaubnis erteilt, sodass ich glaube, dass ich nur Fotos importieren musste. Da sie jedoch zu diesem Zeitpunkt in der App möglicherweise keine Berechtigung erteilt haben, hat das Hinzufügen des Problems kurz vor der Präsentation des Bildauswahl-Controllers das Problem für mich gelöst (auch Fotos importieren).

// request photos permission if permission has not been granted
    if PHPhotoLibrary.authorizationStatus() != PHAuthorizationStatus.authorized {
        PHPhotoLibrary.requestAuthorization({ (status: PHAuthorizationStatus) in

        })
    }

Wenn diese Antwort überflüssig erscheint, entschuldige ich mich, aber ich musste einige andere Antworten zusammenstellen, damit meine Lösung funktioniert. Vielleicht hilft dies jemand anderem, der Swift 4 verwendet.

Jason Rybka
quelle
2

Verwenden Sie diesen Code

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

Dieser Fehler "Error Domain = PlugInKit Code = 13" hat viele Leute verwirrt, obwohl es sich anscheinend um eine harmlose Apple-Debug-Nachricht handelt. Ich hatte Probleme, das von mir ausgewählte Bild in meiner Benutzeroberfläche festzulegen, und dachte, dass dieser Fehler das Problem war, aber etwas subtiler.

Ich habe meinen Bildauswahl-Controller in einer Datei, die von dem Ansichts-Controller getrennt ist, der ihn präsentiert.

MyViewController.swift

class MyViewController: UIViewController {
    @IBOutlet weak var profileImage: UIImageView!

    ...
}

extension MyViewController: ImagePickerDelegate {
    func didSelect(image: UIImage?) {
        self.profileImage.image = image
    }
}

ImagePicker.swift

open class ImagePicker: NSObject {
    ...
    private func pickerController(_ controller: UIImagePickerController, didSelect image: UIImage?) {
        controller.dismiss(animated: true, completion: {self.delegate?.didSelect(image: image)}
        )
    }
}

Bei den meisten Tutorials und Antworten ist der Abschluss auf Null gesetzt. Wenn Sie jedoch die Vervollständigung auf Null setzen und die didSelect-Methode des Delegaten separat aufrufen, wird die Methode aufgerufen, das Image wird jedoch nicht festgelegt. Stellen Sie daher sicher, dass Sie die Vervollständigung "Entlassen" verwenden.

Und wieder weiß ich, dass diese Antwort möglicherweise nicht direkt mit der ursprünglichen Frage zusammenhängt, aber ich habe das Gefühl, dass viele Leute wegen dieses Problems hierher kommen und die gegebenen Lösungen nicht helfen. Der Grund dafür ist, dass die meisten Personen, die Antworten geben, ihren Bildauswahl-Controller in derselben Klasse wie ihren Hauptansichts-Controller haben und daher keine Vervollständigung verwenden müssen.

Braden Holt
quelle
Genau das brauchte ich. Danke dir!
AJ Hernandez
1

Der Fehler tritt auch auf, wenn Sie die Berechtigungen für die Verwendung der Fotobibliothek in Ihrer Info.plistDatei nicht konfiguriert haben .

Sie müssen Privacy - Photo Library Usage Descriptiondie Info.plistmit einer Zeichenfolge hinzufügen, die angezeigt wird, wenn Ihre App zum ersten Mal versucht, auf die Fotobibliothek des Benutzers zuzugreifen.

Die endgültigen Info.plistAnpassungen sollten ungefähr so ​​aussehen: Geben Sie hier die Bildbeschreibung ein

Wissen
quelle
1

Ich habe den gleichen Fehler und habe ihn folgendermaßen behoben:

Das Abrufen des Bildobjekts auf unterschiedliche Weise hängt von UIImagePickerController ab. Erlaubt, dass die Bearbeitung wahr oder falsch ist

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

    if isImagePickerAllowEditing {
        sourceImage = info[UIImagePickerControllerEditedImage] as? UIImage
    } else {
        sourceImage = info[UIImagePickerControllerOriginalImage] as? UIImage
    }

    ....

}

Bitten Sie natürlich zuerst um die Erlaubnis, auf die Fotobibliothek zuzugreifen, wie in den obigen Kommentaren angegeben.

melson.jao
quelle
1

An meinem Ende UINavigationControllerDelegatefehlt der Delegierte.

class YourViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate

Aleem
quelle
0

Ich bin auf das gleiche Problem gestoßen. Keiner der oben genannten Vorschläge hat bei mir funktioniert. Ich habe es jedoch gelöst, indem ich explizit den picker.dismiss angerufen und das Posting entlassen habe. Mir ist nicht klar, warum ich solche Entlassungsanrufe getätigt habe, aber es hat bei mir funktioniert.

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

        print("Image picked")
        picker.dismiss(animated: true, completion: nil)
        dismiss(animated: true) {
            print("dismissed")
             self.delegate?.presentEditor(img: (info[UIImagePickerControllerOriginalImage] as? UIImage)!, id: self.id!)
    }

}
Wyschach
quelle
0

Ich habe all diese Antworten gelesen und hier ein wenig modifiziert und musste nicht entlassen werden. Dies hat bei mir funktioniert. Vielen Dank an andere, die hier geantwortet haben.

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

      print("########### media picked")
      picker.dismiss(animated: true, completion: nil)
      let img = (info[UIImagePickerControllerOriginalImage] as? UIImage)!
      //set img -picked image to "profileImage" UIimageView
      //use image here
       self.profileImage.image = img
       }
    }
Rakshitha Muranga Rodrigo
quelle
0

Ich fand die Lösung von IMage PickerView .....

@IBOutlet weak var myImageView: UIImageView!

var imagePicker = UIImagePickerController()


  @IBAction func selectImage(_ sender: Any) {

        let myPickerController = UIImagePickerController()
        myPickerController.delegate = self;
        myPickerController.sourceType = UIImagePickerControllerSourceType.photoLibrary

        self.present(myPickerController, animated: true, completion: nil)

    }

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

        var selectedImageFromPicker: UIImage?

        if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage
        {
            selectedImageFromPicker = editedImage as! UIImage


        }else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage{

            selectedImageFromPicker = originalImage as! UIImage


        }

        dismiss(animated: true, completion: nil)

        if var selectedImage = selectedImageFromPicker
        {
            myImageView.image = selectedImage
        }

    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }
Muhammad Hamid
quelle
0

Klicken Sie auf imageView, um das Bild aus der Fotobibliothek zu laden und die Vorschau in derselben Bildansicht anzuzeigen. auf schnell 4

 let imagePicker = UIImagePickerController()
        @IBOutlet weak var userImage: UIImageView! 

     override func viewDidLoad() {
                super.viewDidLoad()
                 imagePicker.delegate = self
                let tap = UITapGestureRecognizer(target: self, action: #selector(SignUpViewController.click))
                userImage.addGestureRecognizer(tap)
                userImage.isUserInteractionEnabled = true
            }

            @objc func click()
            {
                imagePicker.allowsEditing = false
                imagePicker.sourceType = .photoLibrary
                present(imagePicker, animated: true, completion: nil)
            }


            @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
                if  let chosenImage = info[UIImagePickerControllerOriginalImage] as? UIImage{
                userImage.contentMode = .scaleAspectFit
                userImage.image = chosenImage
                }
                dismiss(animated: true, completion: nil)
            }

            func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
                dismiss(animated: true, completion: nil)
            }
Roshan Posakya
quelle
0

Hatte das gleiche Problem auf Swift 4.2 und Xcode 10.0 . Obwohl die Bildauswahl ordnungsgemäß funktionierte, zeigte Xcode diesen Fehler auf der Konsole an. Um dies loszuwerden:

  • Im Xcode-Menü Produkt> Schema> Schema bearbeiten
  • Wählen Sie die Registerkarte "Ausführen" und dann "Argumente".
  • Fügen Sie im Abschnitt 'Umgebungsvariablen' eine Variable mit dem Namen OS_ACTIVITY_MODE und dem Wert Deaktivieren hinzu
Marcos Reboucas
quelle
Nun ... nicht wirklich ... für mich zeigt es diesen Fehler, aber die didFinishPickingMediaWithInfo-Methode wird nicht aufgerufen ... also musste ich diesen Wert aktivieren, um diesen Fehler zu sehen
Mohamed Lee