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

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

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ę.


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.


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

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.


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

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 !!!


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.


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.


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

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

Ś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 .


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(...

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

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

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


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)

}

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

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!


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.


2

użyj tego kodu

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

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.


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


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.


1

Z mojej strony UINavigationControllerDelegatebrakuje delegata.

class YourViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate


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

}

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

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

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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.