PhotoPicker bulma hatası: Hata Etki Alanı = PlugInKit Kodu = 13


118

Bir UIImageView'da fotoğraf kitaplığından bir resim görüntülemeye çalışıyorum

Tam hata şudur:

2017-06-09 21: 55: 59.063307 + 0200 firstapp2.0 [12873: 1120778] PhotoPicker keşif hatası: Hata Etki Alanı = PlugInKit Kodu = 13 "sorgu iptal edildi" UserInfo = {NSLocalizedDescription = sorgu iptal edildi}

Kodum aşağıda yer almaktadır:

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
Aynı hatayı aldım. Xcode 9 beta, iOS 11 mi kullanıyorsunuz?
John

4
Bu işe yarıyordu ... ve sonra iOS 11 Beta 4 bana bu hatayı aniden verdi. Çok garip.
user2153553

2
Aynı hatayı alıyorum ve uygulamam obj-c'de. Bu hata mesajı, UIImagePicker temsilci yönteminde objektif-c'de döndürülen bilgi sözlüğünün tür çevrimiyle ilişkili olamaz: - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)infosözlük değerleri obj-c'de id olarak dönüştürülür. Ayrıca, kullanıcının fotoğraf kitaplığına erişmek için yetkilendirme isteğini ve işlemeyi uyguladım: hata mesajı almaya devam ediyorum. Kullanıcının fotoğraf kitaplığı kullanımı için info.plist dosyasına gizlilik girişini ekledim.
valeCocoa

2
Mevcut hatayı alıyorum ancak kütüphaneden görüntü alıp daha sonra kullanmamı engellemiyor ..
shokuroff

3
Tüm yanıtların bir araya getirilmesindeki tüm önerileri boşuna denedim .
Nicolas Miari

Yanıtlar:


39

Açıkça Objective-C referansı yapmanız gerekir: @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
Benim için çalışıyor. Yakın zamanda Swift 4 ve Xcode 9'a güncelleme yaptım ve bu sorunu çözdü.
user3144836

3
Benim için çalışıyor. Swift 4.0'a geçtikten sonra gereklidir.
mayankk2308

4
Çalışmıyor. Bu hata aradıktan sonra oluştu dismiss.
Kimi Chiu

Garip. Bu bir uyarı olarak ancak xcode işaretleri benim için çalıştı ve bir imza bekler: `Örnek yöntemi 'imagePickerController ( : didFinishPickingMediaWithInfo :)' neredeyse opsiyonel gereksinimi maçları 'imagePickerController ( : didFinishPickingMediaWithInfo :)' protokolünün 'UIImagePickerControllerDelegate' Yap 'imagePickerController (_ : didFinishPickingMediaWithInfo :) 'bu uyarıyı susturmak için özel'
Dark Castle

@DarkCastle işlevi extension [your class name]sınıfın dışında bir bloğa yazmanız gerekir .
Prometheos II

18

Bu çözümü buldum. Bu hatayı aşağıda belirtilen bu iki nedenden dolayı aldık.

  1. Öncelikle yetkilendirme için bu yöntemi çağırmamız gerekiyor

Yetki Kodu

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. Yöntemin doğru yolu Çağırma didFinishPickingMediaWithInfo

Yanlış:

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

Sağ

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

Umarım bu çözüm, bu hatayı çözmenize yardımcı olur.

Sizin için işe yararsa, doğru olarak işaretlemeyi unutmayın, bu yüzden bu, diğerlerinin doğru yolu bulmasına yardımcı olacaktır.


Noob PSA: PHPhotoLibrary, Swift'in Fotoğraflar modülünden
Braden Holt

Çalışmıyor. Hata, picker.dismiss(animated: true, completion: nil)
aradıktan

17

Buldum! "Fotoğraflar" için yetkiniz olmadığını size söylemeye çalışıyor.#import <Photos/Photos.h> örneğin Objective-C'ye böyle bir yetki ve talep .

Umarım bu size biraz zaman kazandırır. Bunu hata ayıklamak için iki tam gün geçirdim!

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

Eminim birisi sana Swift'de aynısını nasıl yapacağını söyleyebilir.


1
#import <Fotoğraflar / Fotoğraflar.h>
Robert Wohnoutka

6
Bu benim sorunumu çözmedi.
fi12

1
Konsolda aşağıdaki mesajı alıyorum "Özel etkili kullanıcı ayarlarından okunuyor. Uzantılar keşfedilirken karşılaşılan hatalar: Hata Etki Alanı = PlugInKit Kodu = 13" sorgu iptal edildi "UserInfo = {NSLocalizedDescription = sorgu iptal edildi}". Sorunu çözmedi.
Biranchi

15

Çok fazla başarı olmadan birkaç kombinasyon yanıtını denedim.

Swift 4'ü kullanarak, görüntünün seçildiğinden ve seçiciye yerleştirildiğinden emin olmak için aşağıdaki iki öğenin uygulandığından emin olmam gerektiğini fark ettim (uzantıları keşfederken karşılaşılan "[keşif] hatalarına dikkat edin:

Hata Etki Alanı = PlugInKit Kodu = 13 "sorgu iptal edildi" UserInfo = {NSLocalizedDescription = sorgu iptal edildi} "

mesajı konsolda görüntülenmeye devam eder ancak görüntü eklemenizi engellemez). Belki de bu, seçicinin atılmasına neden olan bir mesajdır?

1) için temsilci UIImagePickerControllerbir (UIImagePickerControllerDelegate & UINavigationControllerDelegate)?ihtiyaç açıkça eklemek çok UINavigationControllerDelegateprotokollerden biri:

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

2) info.plist'in Privacy - Photo library Usage Descriptionanahtar ve Dize değerinin ayarlanmış olduğundan emin olun .

Tabii ki, bir geliştirmesini sağlamak için ihtiyaç UIImagePickerControllerve eşit olan temsilci ayarlamak selfiçinde ViewDidLoad():

class ViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 
    let imagePickerController = UIImagePickerController()
    override func viewDidLoad() {
        super.viewDidLoad()
        imagePickerController.delegate = self
    }
    ...
}

4
bunların hepsi benim projemde var .. hala işe yaramıyor
Mohamed Lee

Teşekkür i viewDidLoad () içinde temsilci ayarı cevapsız
Arshad Shaik

11

Bu sorunu düzelttim, uygulamanızın iznini kontrol etmek için aşağıdaki işlevi viewdidload'a veya viewWillAppear'a veya viewDidAppear'a çağırın.

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

Ve yukarıdaki yöntemi kullanmak import Photosiçin sınıfın en üstüne eklemeyi unutmayın .


11

XCODE 10.1 / SWIFT 4.2:

  1. Gerekli izinleri ekleyin (diğerleri bahsedildi)

  2. Bu temsilci işlevini uygulayın:

    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
İmagePickerController işlevini Swift 4x'te kullanmanın gerçek yolu
Samet Sazak

10

* Swift 3'te DELEGATE eksik *

Benim durumumda, tüm ayarlar doğruydu:
1 - Delegeler (UIImagePickerControllerDelegate, UINavigationControllerDelegate);
2 - İzinler zaten doğrulandı;
3 - Plist zaten yapıldı;
4 - Bu Cevaplarda her şeyi okudum, yaptım;

Ama uygulamaya unuttum pickerview.delegate = selfüzerindeviewDidLoad i COPY Çünkü benim diğer viewController gelen PASTA ve unutma!

Umarım birine yardımcı olur, önce KOPYA / YAPIŞTIRINIZI gözden geçirin !!!


Teşekkürler, uzun saatler boyunca mücadele ediyorum ve "UINavigationControllerDelegate" i kaçırdım, sonunda kurtardın, teşekkürler
Sakthimuthiah


8

Bu, en doğrudan yardımcı yanıt olmayabilir - ama umarım yardımcı olur! Bu özel hata mesajının sizi gerçek soruna yönlendirmediğinden% 99 eminim. Saçımı çekip çıkarmak için saatler harcadım bu aynı sorun.

1) Seçicimi başlattığımda konsola fotoğraf basma yetkim vardı, 2) yeterince kolay bir şekilde gezinebiliyor ve bir fotoğraf seçebiliyordum ve 3) seçiciyi kapattıktan sonra beni görünüme döndüğümde, düğme resmim yeni fotoğrafla güncellenmedi ... ve sorunla ilgili sahip olduğum tek ipucu, aldığınız hata mesajının aynısıydı.

ViewDidLoad yerine ViewWillAppear'da bir yer tutucu resmi sabit kodladığım ortaya çıktı. Seçici her kapattığında, ViewWillAppear'ı çağırıyor ve seçtiğim resmi sabit kodlanmış resmimle değiştiriyordu. Bu sorunu düzelttim ve yeterince emindim - şimdi her şey iyi çalışıyor ... ve seçiciden her döndüğümde hala bu hata mesajını görüyorum.

Probleminiz için ImagePicker dışında bir yere bakmanızı öneririm ve muhtemelen bulursunuz.


7

Bunu yapmadıysanız, deneyin bu .

Ürün> Şema> Şemayı Düzenle> Ortam Değişkenleri OS_ACTIVITY_MODE: disable

Sorunumu çözüyor.


23
Bu, hata mesajlarını bastırır ancak nedenlerini ele almaz. Ayrıca diğer sistem mesajlarını ve herhangi bir şeyi bastırır NSLog.
John Montgomery

6
Bu sorunu 'çözmez', sadece onu görünmez kılar. Çok kötü bir uygulama.
zeeshan

Bu, pisliğinizi halının altına saklamakla eşdeğerdir tbh
shiv

7

Bu, Swift 4'teki sorunu düzeltir:

Aşağıdaki kodu değiştirin

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

buna:

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


Swift 4.2 update:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){}

Hatam şuna benzerdi: uzantıları keşfederken karşılaşılan hatalar: Hata Etki Alanı = PlugInKit Kodu = 13 "sorgu iptal edildi" UserInfo = {NSLocalizedDescription = sorgu iptal edildi} Ve bu, OP'ye yardımcı olursa konuşamadığım halde sorunumu çözdü . Teşekkürler :)
agrippa

6

Seçici geri aramasından başka bir denetleyici sunmaya çalışırken aynı mesajı aldım imagePickerController. Benim için işe yarayan çözüm, kodumu seçici kapatma yönteminden tamamlama geri aramasının içine taşımaktı

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

Güzel cevap, zamanımı kurtardınız 👍🏼
Coder ACJHP

Harika çalıştı! Swift 4.x'teki seçici hatalarının üstesinden gelmenin doğru yolu olduğunu düşünün.
shiv

4

Her ikisini de alt sınıfa ayırdığınızdan emin olun: UIImagePickerControllerDelegate, UINavigationControllerDelegate .

Ayrıca, temsilciyi ayarlamayı unutmayın:

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

Bu kaynağa kredi .


picker.delegate = self - benim durumumdu! Teşekkür ederim.
Alexey Chekanov

4

Bu sorunun çözümünü bulmak beni sonsuza kadar sürdü. Görünüşe göre sorun, UIImagePickerControllerDelegate işlevinin imagePickerController işlevinin bulunamamasıdır. Temsilciyi doğru bir şekilde ayarladıysanız ve Swift 4'e yükselttikten sonra çalışmayı durdurduysa, sorun muhtemelen Swift 4'ten beri gerekli olan @objc kullanarak onu Objective-C için erişilebilir hale getirmemiş olmanızdır.

Olmak zorunda:

@objc func imagePickerController (...

onun yerine

func imagePickerController(...

Hata yaratıyorObjective-C method 'imagePickerController:didFinishPickingMediaWithInfo:' provided by method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' conflicts with optional requirement method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' in protocol 'UIImagePickerControllerDelegate'
Nico Neill

Kesinlikle, bunu düzeltmenin yolu budur!
Maria Ortega

@NicoNeill, işlevi bir extensionbloğa eklediniz mi?
Prometheos II

4

Görüntüyü ayarlarken 1 saniye gecikme ayarlayarak düzeltildi.

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

internal funcBaşta eklediğinizden ve ardından parantezden sonra küçük harf eklediğinizden emin olun ( _ picker: UIImagePickerController…ve sonra AnyObjectyerine Any] değiştirin …
Aşağıdaki kodu kontrol edin:

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

Bu beni şaşırttı, ancak aşağıdaki bağlantıdaki cevap benim için çalıştı. Hata gitti ve görüntü beklendiği gibi görüntüleniyor

Yukarıdaki cevaplardan biri gibi, sahip olmalısınız (_ picker...ama aynı zamanda @objcişlevden önce.

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

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


2

Bu benim hatamı çözdü:

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

Lütfen aşağıdaki adımları izleyin:

  1. Fotoğrafları İçe Aktar
  2. Şu albüme erişimi var:

    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. UIImagePickerController'ı sunma

    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. Anahtar adım, temsilci yönteminin kesinlikle aşağıdaki gibi olduğundan emin olun

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

Yaptığım buydu ve sorunumu çözdü.

  • @objc ekle
  • dahili ekle
  • imagePicker'dan önce _ ekle
  • AnyObject yerine Any öğesini kullandığınızdan emin olun

Bu yardımcı olur umarım!


Hmm, internalvarsayılandır; Bunu belirtmenin ne gibi bir fark yarattığını merak ediyorum ...
Nicolas Miari

2

Benim durumumda bu hatayı alıyordum çünkü ilk önce kullanıcının görüntülere erişime izin verip vermediğini doğrulamadan bir görüntü seçici denetleyicisi sunuyordum. Kodumun başka bir yerinde kullanıcı izin vermişti, bu yüzden tek yapmam gereken Fotoğrafları içe aktarmaktı. Ancak, uygulamada bu noktada izin vermemiş olabileceğinden, bunu resim seçici denetleyicisini sunmadan hemen önce ekleyerek sorunu benim için çözdü (Fotoğrafları da içe aktar).

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

        })
    }

Bu cevap gereksiz görünüyorsa özür dilerim ama çözümümün işe yaraması için birkaç farklı cevabı bir araya getirmek zorunda kaldım. Belki bu, Swift 4'ü kullanan başka birine yardımcı olur.


2

bu kodu kullan

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

2

Bu "Hata Etki Alanı = PlugInKit Kodu = 13" hatası, zararsız bir elma hata ayıklama mesajı gibi görünse de birçok insanı şaşırttı. Kullanıcı arayüzümde ayarlamak için seçtiğim görüntüyü elde etmekte sorun yaşıyordum ve bu hatanın sorun olduğunu düşündüm, ancak biraz daha ince bir şeydi.

Görüntü seçici denetleyicim, kendisini sunan görünüm denetleyicisinden ayrı bir dosyada var.

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

Öğreticilerin ve yanıtların çoğunun tamamlanması sıfır olarak ayarlanmıştır. Bununla birlikte, tamamlamayı nil olarak ayarlarsanız ve temsilcinin didSelect yöntemini ayrı olarak çağırırsanız, yöntem çağrılır, ancak görüntü ayarlanmaz, bu nedenle dismiss 'complete'i kullandığınızdan emin olun.

Ve yine, bu cevabın doğrudan asıl soruyla ilgili olmayabileceğini biliyorum, ancak bu sorun için buraya birçok insanın geldiğini ve verilen çözümlerin yardımcı olmadığını hissediyorum. Bunun nedeni, yanıt veren kişilerin çoğunun görüntü seçici denetleyicisinin ana görüntü denetleyicisiyle aynı sınıfta olması ve bu nedenle bir tamamlama kullanmasına gerek olmamasıdır.


Bu tam olarak ihtiyacım olan şey. Teşekkür ederim!
AJ Hernandez

1

Hata da ne olur Fotoğraf Kitaplığı'nın kullanım izinleri yapılandırmadığınızdan sendeInfo.plist dosyaya.

Sen eklemeniz gerekir Privacy - Photo Library Usage Descriptionde Info.plistbir ile dize App Kullanıcı Resmi Kütüphanesi erişmeye ilk kez çalıştığında görünecektir.

Son Info.plistayarlamalar şunun gibi görünmelidir: görüntü açıklamasını buraya girin


1

Aynı hataya sahibim ve şu şekilde düzelttim:

görüntü nesnesini farklı bir şekilde almak UIImagePickerController'a bağlıdır allowEditing true veya false

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

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

    ....

}

Ve elbette, yukarıdaki yorumlarda olduğu gibi önce fotoğraf kitaplığına erişim izni isteyin.


1

Benim tarafımda UINavigationControllerDelegatedelege kayıp.

class YourViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate


1

Benim durumumda, hızlı tahsis hafızası yönetimi Apple Ekibi tarafından optimize edilmiş ve düzeltilmiş gibi görünüyor. Kodum hızlı bir güncellemeye kadar mükemmel bir şekilde çalışıyordu ve "hatam" ı seçiciyi elimde tutmadığım, ancak uzun zamandır saklama olmadan çalıştığım için burada tam bir çalışmaya hazır çözüm olduğunu fark ettim.

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

Ve

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

0

Ben de aynı problemle karşılaştım. Yukarıda belirtilen önerilerin hiçbiri benim için işe yaramadı. Ancak, açık bir şekilde toplayıcıyı çağırarak çözdüm. Disiss ve bunu postayı reddet. Neden böyle işten çıkarma çağrıları yaptığımı bilmiyorum ama benim için çalıştı.

   @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

Tüm bu cevapları okudum ve burada biraz değiştirildim ve reddetmeye gerek kalmadı, bu benim için çalıştı, Burada cevap verenlere teşekkürler.

    @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

IMage PickerView çözümünü buldum .....

@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

Fotoğraf kitaplığından görüntü yüklemek ve aynı görüntü görünümünde önizlemeyi göstermek için imageView'a tıklayın. hızlı 4'te

 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)
            }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.