Erreur de découverte PhotoPicker: Domaine d'erreur = Code PlugInKit = 13

118

J'essaye d'afficher une image de la photothèque dans une UIImageView

L'erreur complète est:

09/06/2017 21: 55: 59.063307 + 0200 firstapp2.0 [12873: 1120778] Erreur de découverte PhotoPicker: Domaine d'erreur = Code PlugInKit = 13 "requête annulée" UserInfo = {NSLocalizedDescription = requête annulée}

Mon code est inclus ci-dessous:

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
la source
11
J'ai eu la même erreur. utilisez-vous Xcode 9 beta, iOS 11?
John
4
Cela fonctionnait ... et puis iOS 11 Beta 4 m'a donné cette erreur tout à coup. Si étrange.
user2153553
2
J'obtiens la même erreur et mon implémentation est dans obj-c. Ce message d'erreur ne peut pas être lié à la conversion de type du dictionnaire d'informations renvoyé dans la méthode déléguée UIImagePicker dans objective-c: - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)infoles valeurs du dictionnaire sont converties en id dans obj-c. J'ai également implémenté la demande d'autorisation et la gestion pour accéder à la photothèque de l'utilisateur: toujours le message d'erreur. J'ai ajouté dans le fichier info.plist l'entrée de confidentialité pour l'utilisation de la photothèque de l'utilisateur.
valeCocoa
2
Je reçois le bogue actuel mais cela ne m'empêche pas d'obtenir l'image de la bibliothèque et de l'utiliser plus tard ..
shokuroff
3
J'ai essayé toutes les suggestions dans toutes les réponses combinées, en vain.
Nicolas Miari

Réponses:

39

Vous devez faire une référence Objective-C explicite: @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
la source
6
Travaille pour moi. J'avais récemment mis à jour vers Swift 4 et Xcode 9 et cela l'a résolu.
user3144836
3
Travaille pour moi. Requis après la migration vers Swift 4.0.
mayankk2308
4
Ça ne marche pas. Cette erreur s'est produite après que j'ai appelé dismiss.
Kimi Chiu
Étrange. Cela a fonctionné pour moi, mais xcode le marque comme un avertissement et attend une signature de: `Méthode d'instance 'imagePickerController ( : didFinishPickingMediaWithInfo :)' correspond presque à l'exigence facultative 'imagePickerController ( : didFinishPickingMediaWithInfo :)' du protocole 'UIImagePickerControllerDelegate' MakeUpdate (_) : didFinishPickingMediaWithInfo :) 'privé pour faire taire cet avertissement'
Dark Castle
@DarkCastle vous devez écrire la fonction dans un extension [your class name]bloc, en dehors de la classe.
Prometheos II
18

J'ai trouvé cette solution. Nous avons eu cette erreur pour ces deux raisons qui sont mentionnées ci-dessous.

  1. Nous devons d'abord appeler cette méthode pour l'autorisation

Code d'autorisation

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. Méthode correcte Appel de la méthode didFinishPickingMediaWithInfo

Faux:

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

Droite

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

J'espère que cette solution vous aidera à résoudre cette erreur.

Si cela fonctionne pour vous, n'oubliez pas de le marquer comme correct, cela aidera les autres à trouver le bon chemin.

user3159598
la source
Noob PSA: PHPhotoLibrary provient du module Photos de Swift
Braden Holt
Ça ne marche pas. L'erreur se produit après mon appelpicker.dismiss(animated: true, completion: nil)
ForceBru
17

Je l'ai trouvé! Il essaie de vous dire que vous n'avez pas l'autorisation de "photos" Vous devez inclure le #import <Photos/Photos.h>et demander une autorisation par exemple comme celui-ci dans Objective-C.

J'espère que cela vous fera gagner du temps. J'ai passé deux jours entiers à déboguer ça!

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

Je suis sûr que quelqu'un peut vous dire comment faire de même dans Swift.

Robert Wohnoutka
la source
1
assurez-vous d'inclure #import <Photos / Photos.h>
Robert Wohnoutka
6
Cela n'a pas résolu mon problème.
fi12
1
Je reçois le message ci-dessous dans la console "Lecture à partir des paramètres d'utilisateurs effectifs privés. Erreurs rencontrées lors de la découverte d'extensions: Erreur Domaine = Code PlugInKit = 13" requête annulée "UserInfo = {NSLocalizedDescription = requête annulée}". Cela n'a pas résolu le problème.
Biranchi
15

J'ai essayé quelques-unes des réponses combinées sans grand succès.

En utilisant Swift 4, j'ai constaté que je devais m'assurer que les deux éléments suivants étaient mis en œuvre pour m'assurer que l'image était sélectionnée et placée dans le sélecteur (notez que les erreurs "[découverte] rencontrées lors de la découverte d'extensions:

Domaine d'erreur = Code PlugInKit = 13 "requête annulée" UserInfo = {NSLocalizedDescription = requête annulée} "

le message s'affiche toujours dans la console, mais il ne vous empêche pas d'ajouter une image). Peut-être s'agit-il d'un message qui entraîne le rejet du sélecteur?

1) Le délégué pour le UIImagePickerControllerest (UIImagePickerControllerDelegate & UINavigationControllerDelegate)?donc besoin d'ajouter explicitement le UINavigationControllerDelegatecomme l'un des protocoles:

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

2) Assurez-vous que info.plist a la Privacy - Photo library Usage Descriptionclé et la valeur de chaîne définies.

Bien sûr, vous devez vous assurer de créer un UIImagePickerControlleret de définir son délégué égal à selfin ViewDidLoad():

class ViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 
    let imagePickerController = UIImagePickerController()
    override func viewDidLoad() {
        super.viewDidLoad()
        imagePickerController.delegate = self
    }
    ...
}
G Reynolds-Titko
la source
4
j'ai tout cela dans mon projet .. toujours ça ne marche pas
Mohamed Lee
Merci d'avoir manqué le réglage du délégué dans viewDidLoad ()
Arshad Shaik
11

J'ai résolu ce problème, appelez la fonction ci-dessous dans viewdidload ou viewWillAppear ou viewDidAppear pour vérifier l'autorisation de votre application.

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

Et pour utiliser la méthode ci-dessus, n'oubliez pas d'ajouter import Photosen haut de la classe.

logan.Nguyen
la source
11

XCODE 10.1 / SWIFT 4.2:

  1. Ajouter les autorisations requises (autres mentionnées)

  2. Implémentez cette fonction déléguée:

    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)
    }
VENDREDI
la source
1
Véritable façon d'utiliser la fonction imagePickerController sur Swift 4x
Samet Sazak
10

* DELEGATE manquant * dans Swift 3

Dans mon cas, tous les paramètres étaient corrects:
1 - Délégués (UIImagePickerControllerDelegate, UINavigationControllerDelegate);
2 - Autorisations déjà vérifiées;
3 - Plist déjà fait;
4 - Tout ce que j'ai lu sur ces réponses, je l'ai fait;

Mais j'ai oublié de mettre pickerview.delegate = selfen œuvre surviewDidLoad Parce que je copier et coller de mon autre viewController et d' oublier ça!

J'espère que cela aidera quelqu'un, examinez d'abord votre COPIE / COLLE !!!

Daniel Arantes Loverde
la source
Merci, je me bats pendant de longues heures et j'ai raté "UINavigationControllerDelegate", vous avez finalement sauvé, merci
Sakthimuthiah
Heureux d'aider :)
Daniel Arantes Loverde
8

Ce n'est peut-être pas la réponse la plus directement utile - mais j'espère que cela vous aidera! Je suis sûr à 99% que ce message d'erreur particulier ne vous indique pas le vrai problème. J'ai passé des heures à m'arracher les cheveux sur ce même problème.

1) J'avais l'autorisation d'imprimer des photos sur la console lorsque je lançais mon sélecteur, 2) Je pouvais naviguer et choisir une photo assez facilement, et 3) lorsque je me renvoyais à ma vue en rejetant le sélecteur, mon image de bouton n'a pas été mis à jour avec la nouvelle photo ... et le seul indice que j'ai eu au problème était le même message d'erreur que vous recevez.

Il s'avère que je codais en dur une image d'espace réservé dans ViewWillAppear au lieu de ViewDidLoad. Chaque fois que le sélecteur rejetait, il appelait ViewWillAppear et remplaçait l'image de mon choix par mon image codée en dur. J'ai résolu ce problème et bien sûr - tout fonctionne bien maintenant ... et je vois toujours ce message d'erreur à chaque fois que je reviens du sélecteur.

Je recommande de chercher ailleurs que ImagePicker pour votre problème et vous le trouverez probablement.

Levi Lais
la source
7

Si vous ne l'avez pas fait, essayez ceci .

Produit> Schéma> Modifier le schéma> Variables d'environnement OS_ACTIVITY_MODE: disable

Cela résout mon problème.

Changnam Hong
la source
23
Cela supprime les messages d'erreur mais n'aborde pas leur cause. Il supprime également les autres messages système et tout ce qui provient de NSLog.
John Montgomery
6
Cela ne «résout» pas le problème, mais le rend simplement invisible. Très mauvaise pratique.
zeeshan
C'est l'équivalent de cacher sa saleté sous le tapis tbh
shiv
7

Cela résout le problème dans Swift 4:

Changez le code ci-dessous

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

pour ça:

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


Swift 4.2 update:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){}
user2153553
la source
Mon erreur ressemblait à ceci: erreurs rencontrées lors de la découverte d'extensions: Error Domain = PlugInKit Code = 13 "query cancelled" UserInfo = {NSLocalizedDescription = query cancelled} Et cela a résolu mon problème, même si je ne peux pas dire si cela aide l'OP . Merci :)
agrippa
6

J'ai reçu le même message lorsque j'essayais de présenter un autre contrôleur à partir du rappel du sélecteur imagePickerController. La solution qui a fonctionné pour moi était de déplacer mon code dans le rappel d'achèvement de la méthode de rejet du sélecteur

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
la source
Excellente réponse, vous avez économisé mon temps 👍🏼
Coder ACJHP
A fonctionné à merveille! Pensez que c'est la bonne façon de traiter les erreurs de sélection dans Swift 4.x.
shiv
4

Assurez-vous les deux sous - classement: UIImagePickerControllerDelegate, UINavigationControllerDelegate.

N'oubliez pas non plus de définir le délégué:

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

Crédits à cette source .

Ryan
la source
picker.delegate = self - c'était mon cas! Je vous remercie.
Alexey Chekanov
4

Trouver la solution à ce problème m'a pris une éternité. Il semble que le problème soit que la fonction imagePickerController de UIImagePickerControllerDelegate est introuvable. Si vous avez correctement défini le délégué et qu'il a cessé de fonctionner après la mise à niveau vers Swift 4, le problème est probablement que vous ne l'avez pas rendu accessible à Objective-C en utilisant @objc, ce qui est requis depuis Swift 4.

Cela doit être:

@objc func imagePickerController (...

au lieu de

func imagePickerController(...
Apfelsaft
la source
Il crée une erreurObjective-C method 'imagePickerController:didFinishPickingMediaWithInfo:' provided by method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' conflicts with optional requirement method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' in protocol 'UIImagePickerControllerDelegate'
Nico Neill
Exactement, c'est la façon de résoudre le problème!
Maria Ortega
@NicoNeill avez-vous ajouté la fonction dans un extensionbloc?
Prometheos II
4

Correction de ce problème en définissant un délai de 1 seconde lors du réglage de l'image.

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
la source
3

Assurez-vous d'ajouter internal funcau début, puis ajoutez les minuscules après la parenthèse ( _ picker: UIImagePickerController…puis passez de AnyObjectà Any]…
Vérifiez le code ci-dessous:

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
la source
3

Cela m'a laissé perplexe, mais la réponse au lien ci-dessous a fonctionné pour moi. L'erreur a disparu et l'image s'affiche comme prévu

Comme l'une des réponses ci-dessus, vous devez avoir (_ picker...mais aussi @objcavant la fonction.

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

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

EGibson
la source
2

Cela a résolu mon erreur:

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)

}
Développeur iOS
la source
2

Veuillez vérifier par étapes comme suit:

  1. Importer des photos
  2. A accès à l'album:

    func authorizeToAlbum(completion:@escaping (Bool)->Void) {
    
    if PHPhotoLibrary.authorizationStatus() != .authorized {
        NSLog("Will request authorization")
        PHPhotoLibrary.requestAuthorization({ (status) in
            if status == .authorized {
                DispatchQueue.main.async(execute: {
                    completion(true)
                })
            } else {
                DispatchQueue.main.async(execute: {
                    completion(false)
                })
            }
        })
    
    } else {
        DispatchQueue.main.async(execute: {
            completion(true)
        })
    }
    }
  3. Présenter 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. L'étape clé, assurez-vous que la méthode déléguée est comme suivre strictement

    // 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
la source
2

C'est ce que j'ai fait et cela a résolu mon problème.

  • ajouter @objc
  • ajouter interne
  • ajouter _ avant imagePicker
  • assurez-vous que vous utilisez Any et non AnyObject

J'espère que cela t'aides!

FreitDev
la source
Hmm, internalest la valeur par défaut; Je me demande quelle différence ça fait de le préciser ...
Nicolas Miari
2

Dans mon cas, j'obtenais cette erreur parce que je présentais un contrôleur de sélection d'images sans vérifier au préalable si l'utilisateur avait autorisé l'accès aux images. Ailleurs dans mon code, l'utilisateur avait accordé l'autorisation, je pense donc que tout ce que j'avais à faire était d'importer des photos. Cependant, comme ils `` peuvent '' ne pas avoir donné l'autorisation à ce stade dans l'application, l'ajout de cela juste avant de présenter le contrôleur de sélection d'images a résolu le problème pour moi (importer des photos également).

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

        })
    }

Si cette réponse semble redondante, je m'excuse, mais j'ai dû reconstituer quelques réponses différentes pour que ma solution fonctionne. Cela aidera peut-être quelqu'un d'autre à utiliser Swift 4.

Jason Rybka
la source
2

utiliser ce code

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

Cette erreur "Domaine d'erreur = Code PlugInKit = 13" a dérouté beaucoup de gens même si cela semble être un message de débogage Apple inoffensif. J'avais du mal à obtenir l'image que j'avais choisie pour définir dans mon interface utilisateur et je pensais que cette erreur était le problème, mais c'était quelque chose d'un peu plus subtil.

J'ai mon contrôleur de sélecteur d'images dans un fichier séparé du contrôleur de vue qui le présente.

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

La plupart des didacticiels et des réponses ont une complétion définie sur zéro. Cependant, si vous définissez la complétion sur nil et appelez la méthode didSelect du délégué séparément, la méthode est appelée mais l'image n'est pas définie, assurez-vous donc d'utiliser la complétion de rejet.

Et encore une fois, je sais que cette réponse n'est peut-être pas directement liée à la question initiale, mais j'ai le sentiment que beaucoup de gens viennent ici pour ce problème et que les solutions données n'aident pas. La raison en est que la plupart des personnes qui donnent des réponses ont leur contrôleur de sélection d'images dans la même classe que leur contrôleur de vue principal et n'ont donc pas besoin d'utiliser une complétion.

Braden Holt
la source
C'est exactement ce dont j'avais besoin. Je vous remercie!
AJ Hernandez
1

L'erreur se produit également lorsque vous n'avez pas configuré les autorisations d'utilisation de la photothèque en vousInfo.plist fichier.

Vous devez ajouter Privacy - Photo Library Usage Descriptionle Info.plistavec une chaîne qui apparaîtra lorsque votre application essaiera pour la première fois d'accéder à la photothèque de l'utilisateur.

Les Info.plistajustements finaux devraient ressembler à ceci: entrez la description de l'image ici

Connaissance
la source
1

J'ai la même erreur et je l'ai corrigée de cette façon:

obtenir l'objet image de manière différente dépend de UIImagePickerController allowEditing est vrai ou faux

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

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

    ....

}

Et bien sûr, demandez d'abord la permission d'accéder à la photothèque comme dans les commentaires ci-dessus.

melson.jao
la source
1

De mon côté, le UINavigationControllerDelegatedélégué est manquant.

class YourViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate

Aleem
la source
1

Dans mon cas, la gestion de la mémoire d'allocation rapide semble être optimisée et corrigée par Apple Team. Mon code fonctionnait parfaitement jusqu'à une mise à jour rapide et j'ai trouvé que mon "erreur" était que je ne conservais pas le sélecteur, mais cela fonctionne depuis des lustres sans rétention, alors voici une solution prête à l'emploi.

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

Et

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
la source
0

J'ai rencontré le même problème. Aucune des suggestions mentionnées ci-dessus n'a fonctionné pour moi. Cependant, je l'ai résolu, en appelant explicitement le picker.dismiss et en rejetant le message. Je ne sais pas pourquoi j'ai fait des appels de licenciement comme ça, mais cela a fonctionné pour moi.

   @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
la source
0

J'ai lu toutes ces réponses et un peu modifié ici et pas besoin de rejeter, cela a fonctionné pour moi, Merci à tous ceux qui ont répondu ici.

    @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
la source
0

j'ai trouvé la solution d'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
la source
0

cliquez sur imageView pour charger l'image de la photothèque et afficher l'aperçu sur la même vue d'image. sur swift 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
la source