Błąd wykrywania PhotoPicker: Error Domain = PlugInKit Code = 13

118

Próbuję wyświetlić obraz z biblioteki zdjęć w UIImageView

Pełny błąd to:

2017-06-09 21: 55: 59.063307 + 0200 firstapp2.0 [12873: 1120778] Błąd wykrywania PhotoPicker: Error Domain = PlugInKit Code = 13 „zapytanie anulowane” UserInfo = {NSLocalizedDescription = zapytanie anulowane}

Mój kod znajduje się poniżej:

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
źródło
11
Mam ten sam błąd. czy używasz Xcode 9 beta, iOS 11?
John
4
Kiedyś to działało ... a potem iOS 11 Beta 4 nagle dał mi ten błąd. Bardzo dziwne.
user2153553
2
Otrzymuję ten sam błąd, a moja implementacja jest w obj-c. Ten komunikat o błędzie nie może być powiązany z rzutowaniem typu słownika informacji zwróconego w metodzie delegata UIImagePicker w celu-c: - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)infowartości słownika są rzutowane jako id w obj-c. Zaimplementowałem również żądanie autoryzacji i obsługę dostępu do biblioteki zdjęć użytkownika: nadal otrzymuję komunikat o błędzie. Dodałem w pliku info.plist wpis dotyczący prywatności na potrzeby biblioteki zdjęć użytkownika.
valeCocoa
2
Otrzymuję aktualny błąd, ale nie przeszkadza mi on pobrać obrazu z biblioteki i użyć go później ...
shokuroff
3
Wypróbowałem wszystkie sugestie we wszystkich połączonych odpowiedziach, ale bezskutecznie.
Nicolas Miari

Odpowiedzi:

39

Musisz podać wyraźne odniesienie do celu C: @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
źródło
6
Pracuje dla mnie. Niedawno zaktualizowałem do Swift 4 i Xcode 9 i to rozwiązało problem.
user3144836
3
Pracuje dla mnie. Wymagane po migracji do Swift 4.0.
mayankk2308
4
Nie działa. Ten błąd wystąpił po tym, jak zadzwoniłem dismiss.
Kimi Chiu
Dziwne. To zadziałało, ale xcode oznacza to jako ostrzeżenie i oczekuje podpisu: `Instance method 'imagePickerController ( : didFinishPickingMediaWithInfo :)' prawie pasuje do opcjonalnego wymagania 'imagePickerController ( : didFinishPickingMediaWithInfo :)' of protocol 'UIImagePickerControllerDelegate' Make '(imagePickerController : didFinishPickingMediaWithInfo :) 'private to uciszyć to ostrzeżenie `
Dark Castle
@DarkCastle musisz zapisać funkcję w extension [your class name]bloku poza klasą.
Prometheos II
18

Znalazłem to rozwiązanie. Otrzymaliśmy ten błąd z tych dwóch powodów, które są wymienione poniżej.

  1. Najpierw musimy wywołać tę metodę w celu autoryzacji

Kod autoryzacji

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. Prawidłowy sposób wywołania metody didFinishPickingMediaWithInfo

Źle:

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

Dobrze

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

Mam nadzieję, że to rozwiązanie pomoże Ci rozwiązać ten błąd.

Jeśli to działa, nie zapomnij oznaczyć go jako poprawnego, więc pomoże to innym znaleźć właściwą drogę.

user3159598
źródło
Noob PSA: PHPhotoLibrary pochodzi z modułu Zdjęcia Swift
Braden Holt
Nie działa. Błąd picker.dismiss(animated: true, completion: nil)
pojawia
17

Znalazłem to! Próbuje powiedzieć, że nie masz uprawnień do „zdjęć”. Musisz dołączyć rozszerzenie#import <Photos/Photos.h> i zażądać autoryzacji, na przykład taką jak ta w Objective-C.

Mam nadzieję, że zaoszczędzi to trochę czasu. Spędziłem dwa pełne dni na debugowaniu tego!

[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;
    }
}];

Jestem pewien, że ktoś może ci powiedzieć, jak zrobić to samo w Swift.

Robert Wohnoutka
źródło
1
pamiętaj, aby dołączyć #import <Photos / Photos.h>
Robert Wohnoutka
6
To nie rozwiązało mojego problemu.
fi12
1
Otrzymuję poniższy komunikat w konsoli „Odczytywanie z prywatnych efektywnych ustawień użytkownika. Wystąpiły błędy podczas wykrywania rozszerzeń: Error Domain = PlugInKit Code = 13„ zapytanie anulowane ”UserInfo = {NSLocalizedDescription = zapytanie anulowane}”. To nie rozwiązało problemu.
Biranchi,
15

Wypróbowałem kilka kombinacji odpowiedzi bez większego sukcesu.

Korzystając ze Swift 4, stwierdziłem, że muszę upewnić się, że zaimplementowano następujące dwa elementy, aby upewnić się, że obraz został wybrany i umieszczony w selektorze (zwróć uwagę, że podczas wykrywania rozszerzeń wystąpiły błędy „[discovery]”:

Error Domain = PlugInKit Code = 13 "zapytanie anulowane" UserInfo = {NSLocalizedDescription = zapytanie anulowane} "

komunikat nadal jest wyświetlany w konsoli, ale nie uniemożliwia dodania obrazu). Może to jest wiadomość, która powoduje odrzucenie selektora?

1) Delegat dla UIImagePickerControllerma (UIImagePickerControllerDelegate & UINavigationControllerDelegate)?więc potrzeby, aby wyraźnie dodać UINavigationControllerDelegatejako jeden z protokołów:

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

2) Upewnij się, że info.plist ma ustawiony Privacy - Photo library Usage Descriptionklucz i wartość ciągu.

Oczywiście musisz upewnić się, że utworzysz UIImagePickerControlleri ustawisz jego delegata na równe selfw ViewDidLoad():

class ViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 
    let imagePickerController = UIImagePickerController()
    override func viewDidLoad() {
        super.viewDidLoad()
        imagePickerController.delegate = self
    }
    ...
}
G Reynolds-Titko
źródło
4
mam to wszystko w swoim projekcie ... nadal nie działa
Mohamed Lee
Dzięki, przegapiłem ustawienie delegata w widoku DidLoad ()
Arshad Shaik
11

Naprawiłem ten problem, wywołaj poniższą funkcję w viewdidload lub viewWillAppear lub viewDidAppear, aby sprawdzić uprawnienia dla Twojej aplikacji.

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.")
        }
    }

Aby skorzystać z powyższej metody, nie zapomnij dodać import Photosna początku klasy.

logan.Nguyen
źródło
11

XCODE 10.1 / SWIFT 4.2:

  1. Dodaj wymagane uprawnienia (wspomnieliśmy o innych)

  2. Zaimplementuj tę funkcję delegata:

    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)
    }
PIĄTEK
źródło
1
Prawdziwy sposób korzystania z funkcji imagePickerController w Swift 4x
Samet Sazak
10

* Brak DELEGATE * w Swift 3

W moim przypadku wszystkie ustawienia były poprawne:
1 - Delegaci (UIImagePickerControllerDelegate, UINavigationControllerDelegate);
2 - Uprawnienia już zweryfikowane;
3 - Plist już wykonane;
4 - Wszystko, co przeczytałem w tej odpowiedzi, zrobiłem;

Ale zapomniałem zaimplementować pickerview.delegate = selfna viewDidLoad Ponieważ KOPIUJĘ i WKLEJĘ z mojego innego kontrolera widoku i zapomnij o tym!

Mam nadzieję, że komuś to pomoże, najpierw przejrzyj KOPIUJ / WKLEJ !!!

Daniel Arantes Loverde
źródło
Dzięki, walczę przez długie godziny i przegapiłem "UINavigationControllerDelegate", w końcu uratowałeś, dzięki
Sakthimuthiah
Cieszę się, że mogłem pomóc :)
Daniel Arantes Loverde
8

To może nie być najbardziej bezpośrednio pomocna odpowiedź - ale miejmy nadzieję, że pomoże! Jestem w 99% pewien, że ten konkretny komunikat o błędzie w rzeczywistości nie wskazuje na prawdziwy problem. Spędziłem godziny wyciągając włosy z tego samego problemu.

1) Miałem zezwolenie na drukowanie zdjęć na konsoli, kiedy uruchamiałem mój selektor, 2) mogłem nawigować i wybierać zdjęcie dość łatwo, oraz 3) kiedy wracałem do widoku po zamknięciu selektora, mój obraz przycisku nie został zaktualizowany o nowe zdjęcie ... a jedyną wskazówką, jaką miałem co do problemu, był dokładnie ten sam komunikat o błędzie, który otrzymujesz.

Okazuje się, że na stałe zakodowałem obraz zastępczy w ViewWillAppear zamiast ViewDidLoad. Za każdym razem, gdy selektor się zamykał, wywoływał ViewWillAppear i zastępował mój wybrany obraz moim na stałe zakodowanym obrazem. Naprawiłem ten problem i rzeczywiście - teraz wszystko działa dobrze ... i nadal widzę ten komunikat o błędzie za każdym razem, gdy wracam z selektora.

Zalecam szukanie problemu w innym miejscu niż ImagePicker i prawdopodobnie go znajdziesz.

Levi Lais
źródło
7

Jeśli tego nie zrobiłeś, spróbuj tego .

Produkt> Schemat> Edytuj schemat> Zmienne środowiskowe OS_ACTIVITY_MODE: disable

To rozwiązuje mój problem.

Changnam Hong
źródło
23
Eliminuje to komunikaty o błędach, ale nie rozwiązuje ich przyczyny. Tłumi również inne komunikaty systemowe i wszystko z NSLog.
John Montgomery
6
To nie „rozwiązuje” problemu, po prostu czyni go niewidzialnym. Bardzo zła praktyka.
zeeshan
To odpowiednik ukrywania brudu pod dywanikiem tbh
shiv
7

To rozwiązuje problem w Swift 4:

Zmień poniższy kod

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

do tego:

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


Swift 4.2 update:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){}
user2153553
źródło
Mój błąd wyglądał mniej więcej tak: błędy napotkane podczas wykrywania rozszerzeń: Error Domain = PlugInKit Code = 13 "zapytanie anulowane" UserInfo = {NSLocalizedDescription = zapytanie anulowane} I to rozwiązało mój problem, chociaż nie mogę rozmawiać, jeśli to pomaga OP . Dzięki :)
agrippa
6

Otrzymałem tę samą wiadomość, gdy próbowałem przedstawić inny kontroler z wywołania zwrotnego selektora imagePickerController. Rozwiązaniem, które zadziałało dla mnie, było przeniesienie mojego kodu wewnątrz wywołania zwrotnego zakończenia z metody odrzucania selektora

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
źródło
Świetna odpowiedź, zaoszczędziłeś mój czas 👍🏼
Coder ACJHP,
Działało cudownie! Pomyśl, że to właściwy sposób radzenia sobie z błędami selektora w Swift 4.x.
shiv
4

Upewnij się, że tworzysz podklasy obu: UIImagePickerControllerDelegate, UINavigationControllerDelegate .

Pamiętaj też, aby ustawić delegata:

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

Kredyty dla tego źródła .

Ryan
źródło
picker.delegate = self - tak było w moim przypadku! Dziękuję Ci.
Alexey Chekanov
4

Znalezienie rozwiązania tego problemu zajęło mi wieczność. Wygląda na to, że problem polega na tym, że nie można znaleźć funkcji imagePickerController elementu UIImagePickerControllerDelegate. Jeśli poprawnie ustawiłeś delegata i przestał działać po uaktualnieniu do Swift 4, problem polega prawdopodobnie na tym, że nie udostępniłeś go Objective-C za pomocą @objc, który jest wymagany od wersji Swift 4.

To musi być:

@objc func imagePickerController (...

zamiast

func imagePickerController(...
Apfelsaft
źródło
Tworzy błądObjective-C method 'imagePickerController:didFinishPickingMediaWithInfo:' provided by method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' conflicts with optional requirement method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' in protocol 'UIImagePickerControllerDelegate'
Nico Neill
Dokładnie, to jest sposób, aby to naprawić!
Maria Ortega
@NicoNeill, czy dodałeś funkcję do extensionbloku?
Prometheos II
4

Naprawiono to, ustawiając 1 sekundowe opóźnienie podczas ustawiania obrazu.

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
źródło
3

Pamiętaj, aby dodać internal funcna początku, a następnie dodać małą literę po nawiasie ( _ picker: UIImagePickerController…a następnie zmienić z AnyObjectna Any]…
Sprawdź kod poniżej:

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
źródło
3

Zaskoczyło mnie to, ale odpowiedź pod linkiem poniżej zadziałała. Błąd zniknął i obraz wyświetla się zgodnie z oczekiwaniami

Podobnie jak w przypadku jednej z powyższych odpowiedzi, musisz mieć, (_ picker...ale także @objcprzed funkcją.

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

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

EGibson
źródło
2

To rozwiązało mój błąd:

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)

}
Programista iOS
źródło
2

Sprawdź, wykonując następujące czynności:

  1. Importuj zdjęcia
  2. Ma dostęp do albumu:

    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. Przedstaw 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. Kluczowy krok, upewnij się, że metoda delegata jest jak ścisłe przestrzeganie

    // 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
źródło
2

To właśnie zrobiłem i to rozwiązało mój problem.

  • dodaj @objc
  • dodaj wewnętrzny
  • dodaj _ przed imagePicker
  • upewnij się, że używasz Any, a nie AnyObject

Mam nadzieję że to pomoże!

FreitDev
źródło
Hmm, internalto ustawienie domyślne; Zastanawiam się, jaką różnicę robi to sprecyzowanie ...
Nicolas Miari
2

W moim przypadku otrzymałem ten błąd, ponieważ prezentowałem kontroler selektora obrazów bez uprzedniej weryfikacji, czy użytkownik zezwolił na dostęp do obrazów. W innym miejscu mojego kodu użytkownik udzielił pozwolenia, więc myślę, że wszystko, co musiałem zrobić, to zaimportować zdjęcia. Jednak ponieważ `` mogli '' nie udzielić pozwolenia w tym momencie w aplikacji, dodanie tego tuż przed przedstawieniem kontrolera selektora obrazów rozwiązało problem (również importuj zdjęcia).

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

        })
    }

Jeśli ta odpowiedź wydaje się zbędna, przepraszam, ale musiałem poskładać kilka różnych odpowiedzi, aby moje rozwiązanie działało. Być może pomoże to komuś innemu w korzystaniu ze Swift 4.

Jason Rybka
źródło
2

użyj tego kodu

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
jaskiratjd
źródło
2

Ten błąd „Error Domain = PlugInKit Code = 13” wprawił wiele osób w zakłopotanie, chociaż wydaje się, że jest to nieszkodliwa wiadomość debugowania Apple. Miałem problem z uzyskaniem obrazu, który wybrałem do ustawienia w moim interfejsie użytkownika i pomyślałem, że ten błąd był problemem, ale było to coś bardziej subtelnego.

Mam kontroler selektora obrazu w pliku oddzielnym od kontrolera widoku, który go prezentuje.

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)}
        )
    }
}

Większość samouczków i odpowiedzi ma ukończenie ustawione na zero. Jeśli jednak ustawisz uzupełnianie na nil i osobno wywołasz metodę didSelect delegata, metoda zostanie wywołana, ale obraz nie zostanie ustawiony, więc upewnij się, że używasz uzupełniania odrzucenia.

I znowu, wiem, że ta odpowiedź może nie być bezpośrednio związana z pierwotnym pytaniem, ale mam wrażenie, że wiele osób przychodzi tutaj w związku z tym problemem i podane rozwiązania nie pomagają. Powodem jest to, że większość osób udzielających odpowiedzi ma kontroler selektora obrazu w tej samej klasie co kontroler głównego widoku, a zatem nie musi używać uzupełnienia.

Braden Holt
źródło
Właśnie tego potrzebowałem. Dziękuję Ci!
AJ Hernandez
1

Błąd występuje również, gdy nie skonfigurowałeś uprawnień do korzystania z biblioteki zdjęć w swoim Info.plistpliku.

Trzeba dodać Privacy - Photo Library Usage Descriptionw Info.plistz String , który pojawi się, gdy App próbuje po raz pierwszy, aby uzyskać dostęp do biblioteki fotografii Użytkownika.

Ostateczne Info.plistpoprawki powinny wyglądać mniej więcej tak: wprowadź opis obrazu tutaj

Wiedza, umiejętności
źródło
1

Mam ten sam błąd i naprawiłem go w ten sposób:

get image w inny sposób zależy od UIImagePickerController allowEditing jest true lub false

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

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

    ....

}

I oczywiście najpierw poproś o pozwolenie na dostęp do biblioteki zdjęć, jak w powyższych komentarzach.

melson.jao
źródło
1

Z mojej strony UINavigationControllerDelegatebrakuje delegata.

class YourViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate

Aleem
źródło
0

Natknąłem się na ten sam problem. Żadna z wyżej wymienionych sugestii nie zadziałała dla mnie. Jednak rozwiązałem to, jawnie dzwoniąc do selektora. Odrzuć i odrzuć opublikowanie tego. Nie rozumiem, dlaczego wykonałem takie wezwania, ale to zadziałało.

   @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!)
    }

}
Vyshakh
źródło
0

Przeczytałem wszystkie te odpowiedzi i trochę zmodyfikowałem tutaj i nie trzeba było ich odrzucać, to zadziałało dla mnie, dziękuję innym, którzy odpowiedzieli tutaj.

    @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
źródło
0

znalazłem rozwiązanie 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
źródło
0

kliknij imageView, aby załadować obraz z biblioteki zdjęć i wyświetlić podgląd w tym samym widoku obrazu. na szybkie 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
źródło
0

Miał ten sam problem w Swift 4.2 i Xcode 10.0 . Chociaż selektor obrazów działał poprawnie, Xcode pokazał ten błąd na konsoli. Aby się tego pozbyć:

  • W menu Xcode Produkt> Schemat> Edytuj schemat
  • Wybierz kartę „Uruchom”, a następnie „Argumenty”
  • W sekcji „Zmienne środowiskowe” dodaj zmienną o nazwie OS_ACTIVITY_MODE i wyłączonej wartości
Marcos Reboucas
źródło
Cóż ... nie do końca ... dla mnie pokazuje ten błąd, ale metoda didFinishPickingMediaWithInfo nie jest wywoływana ... więc musiałem włączyć tę wartość, aby zobaczyć ten błąd
Mohamed Lee