Kesalahan penemuan PhotoPicker: Error Domain = PlugInKit Code = 13

118

Saya mencoba untuk menampilkan gambar dari perpustakaan foto di UIImageView

Kesalahan lengkapnya adalah:

09-06-2017 21: 55: 59.063307 + 0200 firstapp2.0 [12873: 1120778] Kesalahan penemuan PhotoPicker: Error Domain = PlugInKit Code = 13 "kueri dibatalkan" UserInfo = {NSLocalizedDescription = kueri dibatalkan}

Kode saya disertakan di bawah ini:

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
sumber
11
Saya mendapat kesalahan yang sama. apakah Anda menggunakan Xcode 9 beta, iOS 11?
Yohanes
4
Ini dulu berfungsi ... dan kemudian iOS 11 Beta 4 memberi saya kesalahan ini tiba-tiba. Sangat aneh.
pengguna2153553
2
Saya mendapatkan kesalahan yang sama dan implementasi saya di obj-c. Pesan kesalahan ini tidak bisa terkait dengan tipe casting kamus info yang dikembalikan dalam metode delegasi UIImagePicker di objektif-c: - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)infonilai kamus dicor sebagai id di obj-c. Saya juga telah menerapkan permintaan otorisasi dan penanganan untuk mengakses perpustakaan foto pengguna: masih mendapatkan pesan kesalahan. Saya telah menambahkan di file info.plist entri privasi untuk penggunaan perpustakaan foto pengguna.
valeCocoa
2
Saya menerima bug saat ini namun tidak menghalangi saya untuk mendapatkan gambar dari perpustakaan dan menggunakannya nanti ..
shokuroff
3
Saya mencoba semua saran di semua jawaban yang digabungkan, tetapi tidak berhasil.
Nicolas Miari

Jawaban:

39

Anda perlu membuat referensi Objective-C eksplisit: @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
sumber
6
Bekerja untuk saya. Saya baru saja memperbarui ke Swift 4 dan Xcode 9 dan ini menyelesaikannya.
user3144836
3
Bekerja untuk saya. Diperlukan setelah bermigrasi ke Swift 4.0.
mayankk2308
4
Tidak berhasil. Kesalahan ini terjadi setelah saya menelepon dismiss.
Kimi Chiu
Aneh. Ini berfungsi untuk saya namun xcode menandainya sebagai peringatan dan mengharapkan tanda tangan dari: `Metode Instance 'imagePickerController ( : didFinishPickingMediaWithInfo :)' hampir cocok dengan persyaratan opsional 'imagePickerController ( : didFinishPickingMediaWithInfo :)' dari protokol 'UIImagePickerControllerDelegate' Make 'imagePickerController (_ : didFinishPickingMediaWithInfo :) 'pribadi untuk membungkam peringatan ini `
Dark Castle
@DarkCastle Anda perlu menulis fungsi ke dalam extension [your class name]blok, di luar kelas.
Prometheos II
18

Saya menemukan solusi ini. Kami mendapat kesalahan ini karena dua alasan yang disebutkan di bawah ini.

  1. Pertama kita perlu memanggil metode ini untuk otorisasi

Kode Otorisasi

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. Cara yang benar dari metode Memanggil didFinishPickingMediaWithInfo

Salah:

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

Baik

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

Saya harap solusi ini akan membantu Anda mengatasi kesalahan ini.

Jika berhasil, jangan lupa menandainya sebagai benar, jadi ini akan membantu orang lain menemukan cara yang benar.

pengguna3159598
sumber
Noob PSA: PHPhotoLibrary berasal dari modul Foto Swift
Braden Holt
Tidak berhasil. Kesalahan terjadi setelah saya meneleponpicker.dismiss(animated: true, completion: nil)
ForceBru
17

Aku menemukannya! Ini mencoba memberi tahu Anda bahwa Anda tidak memiliki otorisasi untuk "foto". Anda perlu menyertakan #import <Photos/Photos.h>dan meminta otorisasi misalnya seperti ini di Objective-C.

Semoga ini bisa menghemat waktu Anda. Saya menghabiskan dua hari penuh untuk men-debug ini!

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

Saya yakin seseorang dapat memberi tahu Anda cara melakukan hal yang sama di Swift.

Robert Wohnoutka
sumber
1
pastikan untuk menyertakan #import <Foto / Foto.h>
Robert Wohnoutka
6
Ini tidak memperbaiki masalah saya.
fi12
1
Saya mendapatkan pesan di bawah ini di konsol "Membaca dari pengaturan pengguna efektif pribadi. Kesalahan yang ditemukan saat menemukan ekstensi: Error Domain = PlugInKit Code = 13" query cancel "UserInfo = {NSLocalizedDescription = query Cancelled}". Itu tidak menyelesaikan masalah.
Biranchi
15

Mencoba beberapa respons kombinasi tanpa banyak keberhasilan.

Dengan menggunakan Swift 4, saya menemukan bahwa saya perlu memastikan dua item berikut diimplementasikan untuk memastikan bahwa gambar dipilih dan ditempatkan ke dalam picker (perhatikan bahwa kesalahan "[penemuan] ditemukan saat menemukan ekstensi:

Domain Kesalahan = Kode PlugInKit = 13 "kueri dibatalkan" UserInfo = {NSLocalizedDescription = kueri dibatalkan} "

pesan masih ditampilkan di konsol, tetapi itu tidak mencegah Anda untuk menambahkan gambar). Mungkin ini adalah pesan yang menyebabkan alat pilih ditutup?

1) delegasi untuk UIImagePickerControllerini (UIImagePickerControllerDelegate & UINavigationControllerDelegate)?sehingga perlu secara eksplisit menambahkan UINavigationControllerDelegatesebagai salah satu protokol:

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

2) Pastikan info.plist memiliki Privacy - Photo library Usage Descriptionkunci dan nilai String yang ditetapkan.

Tentu saja, Anda perlu memastikan bahwa Anda membuat UIImagePickerControllerdan menetapkan delegasinya sama dengan selfdi ViewDidLoad():

class ViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 
    let imagePickerController = UIImagePickerController()
    override func viewDidLoad() {
        super.viewDidLoad()
        imagePickerController.delegate = self
    }
    ...
}
G Reynolds-Titko
sumber
4
saya memiliki semua ini dalam proyek saya .. masih belum berhasil
Mohamed Lee
Terima kasih saya melewatkan pengaturan delegasi di viewDidLoad ()
Arshad Shaik
11

Saya memperbaiki masalah ini, panggil fungsi di bawah ini ke viewdidload atau viewWillAppear atau viewDidAppear untuk memeriksa izin untuk aplikasi Anda.

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

Dan untuk menggunakan metode di atas, jangan lupa tambahkan import Photosdi atas kelas.

logan.Nguyen
sumber
11

XCODE 10.1 / SWIFT 4.2:

  1. Tambahkan izin yang diperlukan (orang lain disebutkan)

  2. Terapkan fungsi delegasi ini:

    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)
    }
JUMAT
sumber
1
Cara yang benar untuk menggunakan imagePickerController func pada Swift 4x
Samet Sazak
10

* Hilang DELEGATE * di Swift 3

Dalam kasus saya, semua pengaturan sudah benar:
1 - Delegates (UIImagePickerControllerDelegate, UINavigationControllerDelegate);
2 - Izin sudah diverifikasi;
3 - Plist sudah selesai;
4 - Semuanya membaca Jawaban ini, saya lakukan;

Tapi saya lupa untuk menerapkan pickerview.delegate = selfpada viewDidLoad Karena saya copy paste dari viewController saya yang lain dan lupa bahwa!

Saya harap ini membantu seseorang, tinjau COPY / PASTE Anda terlebih dahulu !!!

Daniel Arantes Loverde
sumber
Terima kasih, saya berjuang selama berjam-jam dan saya telah melewatkan "UINavigationControllerDelegate", Anda akhirnya menabung, terima kasih
Sakthimuthiah
Senang bisa membantu :)
Daniel Arantes Loverde
8

Ini mungkin bukan jawaban yang paling membantu secara langsung - tapi semoga bisa membantu! Saya 99% yakin bahwa pesan kesalahan khusus ini tidak benar-benar mengarahkan Anda ke masalah sebenarnya. Saya menghabiskan waktu berjam-jam untuk menarik rambut saya karena masalah yang sama persis.

1) Saya memiliki otorisasi untuk mencetak foto ke konsol ketika saya meluncurkan alat pilih saya, 2) Saya dapat menavigasi dan memilih foto dengan cukup mudah, dan 3) ketika saya akan mengembalikan saya ke tampilan setelah menutup alat pilih, gambar tombol saya tidak diperbarui dengan foto baru ... dan satu-satunya petunjuk bahwa saya memiliki masalah adalah pesan kesalahan yang sama persis dengan yang Anda terima.

Ternyata saya melakukan hard-coding untuk gambar placeholder di ViewWillAppear, bukan ViewDidLoad. Setiap kali picker menutup, itu memanggil ViewWillAppear dan mengganti gambar yang saya pilih dengan gambar hard code saya. Saya memperbaiki masalah itu dan cukup yakin - semuanya berfungsi dengan baik sekarang ... dan saya masih melihat pesan kesalahan itu setiap kali saya kembali dari pemetik.

Saya sarankan mencari di tempat lain selain ImagePicker untuk masalah Anda dan kemungkinan besar Anda akan menemukannya.

Levi Lais
sumber
7

Jika Anda belum melakukannya, coba ini .

Produk> Skema> Edit Skema> Variabel Lingkungan OS_ACTIVITY_MODE: disable

Ini memecahkan masalah saya.

Changnam Hong
sumber
23
Ini menekan pesan kesalahan tetapi tidak mengatasi penyebabnya. Itu juga menekan pesan sistem lain dan apa pun dari NSLog.
John Montgomery
6
Ini tidak 'menyelesaikan' masalah, hanya membuatnya tidak terlihat. Praktik yang sangat buruk.
zeeshan
Ini sama saja dengan menyembunyikan kotoran Anda di bawah permadani tbh
shiv
7

Ini memperbaiki masalah di Swift 4:

Ubah kode di bawah ini

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

untuk ini:

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


Swift 4.2 update:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){}
pengguna2153553
sumber
Kesalahan saya terlihat seperti ini: kesalahan yang ditemukan saat menemukan ekstensi: Error Domain = PlugInKit Code = 13 "query Cancelled" UserInfo = {NSLocalizedDescription = query cancel} Dan ini menyelesaikan masalah saya, meskipun saya tidak dapat berbicara jika ini membantu OP . Terima kasih :)
agrippa
6

Saya mendapat pesan yang sama ketika saya mencoba menampilkan pengontrol lain dari pemanggil callback imagePickerController. Solusi yang berhasil bagi saya adalah memindahkan kode saya di dalam callback penyelesaian dari metode pemecatan pemilih

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
sumber
Jawaban bagus, Anda menghemat waktu saya 👍🏼
Coder ACJHP
Bekerja dengan sangat baik! Pikirkan ini adalah cara yang benar untuk menangani kesalahan picker di Swift 4.x.
belati
4

Pastikan Anda subclassing kedua: UIImagePickerControllerDelegate, UINavigationControllerDelegate.

Juga, ingatlah untuk mengatur delegasi:

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

Penghargaan untuk sumber ini .

Ryan
sumber
picker.delegate = self - adalah kasus saya! Terima kasih.
Alexey Chekanov
4

Menemukan perbaikan untuk masalah ini membutuhkan waktu lama bagi saya. Sepertinya masalahnya adalah fungsi imagePickerController dari UIImagePickerControllerDelegate tidak dapat ditemukan. Jika Anda telah menyetel delegasi dengan benar dan berhenti berfungsi setelah memutakhirkan ke Swift 4, masalahnya mungkin Anda tidak membuatnya dapat diakses oleh Objective-C dengan menggunakan @objc yang diperlukan sejak Swift 4.

Itu harus:

@objc func imagePickerController (...

dari pada

func imagePickerController(...
Apfelsaft
sumber
Ini menciptakan kesalahanObjective-C method 'imagePickerController:didFinishPickingMediaWithInfo:' provided by method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' conflicts with optional requirement method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' in protocol 'UIImagePickerControllerDelegate'
Nico Neill
Persis, inilah cara memperbaikinya!
Maria Ortega
@NicoNeill apakah Anda menambahkan fungsi ke dalam extensionblok?
Prometheos II
4

Memperbaiki dengan mengatur penundaan 1 detik saat mengatur gambar.

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
sumber
3

Pastikan untuk menambahkan internal funcdi awal dan kemudian tambahkan huruf kecil setelah tanda kurung ( _ picker: UIImagePickerController…lalu ubah dari AnyObjectmenjadi Any]…
Periksa kode di bawah ini:

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
sumber
3

Ini membuat saya bingung, tetapi jawaban di tautan di bawah ini berhasil untuk saya. Kesalahan hilang dan gambar ditampilkan seperti yang diharapkan

Seperti salah satu jawaban di atas, Anda harus memiliki (_ picker...tetapi juga @objcsebelum fungsinya.

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

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

EGibson
sumber
2

Ini memecahkan kesalahan saya:

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)

}
Pengembang iOS
sumber
2

Silakan periksa dengan langkah-langkah sebagai berikut:

  1. Impor Foto
  2. Memiliki akses ke 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. Sajikan 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. Langkah kuncinya, pastikan metode delegasi seperti mengikuti secara ketat

    // 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
sumber
2

Inilah yang saya lakukan dan itu memecahkan masalah saya.

  • tambahkan @objc
  • tambahkan internal
  • tambahkan _ sebelum imagePicker
  • pastikan Anda menggunakan Any dan bukan AnyObject

Semoga ini membantu!

FreitDev
sumber
Hmm, internaladalah defaultnya; Aku ingin tahu apa bedanya untuk menentukannya ...
Nicolas Miari
2

Dalam kasus saya, saya mendapatkan kesalahan ini karena saya menampilkan pengontrol pemilih gambar tanpa terlebih dahulu memverifikasi apakah pengguna telah mengizinkan akses ke gambar. Di tempat lain dalam kode saya, pengguna telah memberikan izin jadi saya pikir yang perlu saya lakukan hanyalah mengimpor Foto. Namun, karena mereka 'mungkin' tidak memberikan izin pada saat itu di aplikasi menambahkan ini tepat sebelum saya menyajikan pengontrol pemilih gambar memecahkan masalah untuk saya (impor Foto juga).

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

        })
    }

Jika jawaban ini tampak berlebihan, permintaan maaf saya, tetapi saya harus mengumpulkan dari beberapa jawaban berbeda agar solusi saya berfungsi. Mungkin ini akan membantu orang lain yang menggunakan Swift 4.

Jason Rybka
sumber
2

gunakan kode ini

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

Kesalahan "Domain Kesalahan = PlugInKit Code = 13" ini telah membingungkan banyak orang meskipun tampaknya ini adalah pesan debug apel yang tidak berbahaya. Saya mengalami kesulitan mendapatkan gambar yang saya pilih untuk disetel di UI saya dan berpikir bahwa kesalahan itu adalah masalahnya, namun itu adalah sesuatu yang sedikit lebih halus.

Saya memiliki pengontrol pemilih gambar dalam file yang terpisah dari pengontrol tampilan yang menampilkannya.

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

Sebagian besar tutorial dan jawaban memiliki penyelesaian disetel ke nol. Namun jika Anda menyetel penyelesaian ke nihil dan memanggil metode didSelect delegasi secara terpisah, metode tersebut akan dipanggil tetapi gambarnya tidak disetel, jadi pastikan untuk menggunakan penyelesaian 'tutup'.

Dan sekali lagi, saya tahu jawaban ini mungkin tidak terkait langsung dengan pertanyaan awal tetapi saya merasa banyak orang datang ke sini untuk masalah ini dan solusi yang diberikan tidak membantu. Alasannya adalah bahwa sebagian besar orang yang memberikan jawaban memiliki pengontrol pemilih gambar di kelas yang sama dengan pengontrol tampilan utama, sehingga tidak perlu menggunakan penyelesaian.

Braden Holt
sumber
Inilah yang saya butuhkan. Terima kasih!
AJ Hernandez
1

Kesalahan juga terjadi ketika Anda belum mengkonfigurasi izin penggunaan Perpustakaan Foto di Info.plistfile Anda .

Anda perlu menambahkan Privacy - Photo Library Usage Descriptiondalam Info.plistdengan String yang akan muncul ketika App Anda mencoba pertama kalinya untuk mengakses Perpustakaan Foto Pengguna.

Info.plistPenyesuaian terakhir akan terlihat seperti ini: masukkan deskripsi gambar di sini

Pengetahuan
sumber
1

Saya memiliki kesalahan yang sama dan saya memperbaikinya dengan cara ini:

mendapatkan objek gambar dengan cara berbeda tergantung pada UIImagePickerController allowEditing benar atau salah

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

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

    ....

}

Dan tentunya mintalah ijin untuk mengakses pustaka foto terlebih dahulu seperti komentar diatas.

melson.jao
sumber
1

Pada akhirnya, UINavigationControllerDelegatedelegasi saya hilang.

class YourViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate

Aleem
sumber
1

Dalam kasus saya karena manajemen memori alokasi cepat tampaknya dioptimalkan dan diperbaiki oleh Tim Apple. Kode saya bekerja dengan sempurna sampai pembaruan yang cepat dan saya menemukan "kesalahan" saya adalah bahwa saya tidak mempertahankan pemetik tetapi telah bekerja selama berabad-abad tanpa retensi jadi di sini solusi siap kerja penuh.

// Add Privacy - Photo Library Usage Description to your info.plist
<key>NSPhotoLibraryUsageDescription</key>
<string>APPNAME need to access your pictures to violate your privacy :P</string>

Dan

import Photos    
class MyImageSelector: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {

    var picker = UIImagePickerController() 
    // Make sure to retain this picker var until the picker returned

    func checkPermission() {
        let call = self.presentAuthorized

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

    }

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

    @objc public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        // DO something with picture
    }

    @objc public func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        // User cancelled the pick
    }
}
Benpaper
sumber
0

Saya menemukan masalah yang sama. Tak satu pun dari saran yang disebutkan di atas berhasil untuk saya. Namun, saya menyelesaikannya, dengan secara eksplisit memanggil picker.dismiss dan mengabaikan posting itu. Saya tidak jelas mengapa saya melakukan panggilan keluar seperti itu, tetapi itu berhasil untuk saya.

   @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
sumber
0

Saya membaca semua jawaban ini dan sedikit dimodifikasi di sini dan tidak perlu ditutup, ini berhasil untuk saya, Terima kasih orang lain yang telah menjawab di sini.

    @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
sumber
0

saya menemukan solusi dari 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
sumber
0

klik imageView untuk memuat gambar dari perpustakaan foto dan menampilkan pratinjau pada imageview yang sama. dengan cepat 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
sumber