Swift PhotoPicker发现错误:错误域=PlugInKit代码=13

Swift PhotoPicker发现错误:错误域=PlugInKit代码=13,swift,uiimage,ios11,Swift,Uiimage,Ios11,我试图在UIImageView中显示照片库中的图像 完全错误是: 2017-06-09 21:55:59.063307+0200 firstapp2.0[12873:1120778]光采集器 发现错误:错误域=PlugInKit代码=13“查询已取消” UserInfo={NSLocalizedDescription=查询已取消} 我的代码包括在下面: import UIKit class ViewController: UIViewController,UIImagePickerContro

我试图在UIImageView中显示照片库中的图像

完全错误是:

2017-06-09 21:55:59.063307+0200 firstapp2.0[12873:1120778]光采集器 发现错误:错误域=PlugInKit代码=13“查询已取消” UserInfo={NSLocalizedDescription=查询已取消}

我的代码包括在下面:

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

您需要进行明确的Objective-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)
}

这解决了Swift 4中的问题:

更改下面的代码

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

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


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

确保在开头添加
internal func
,然后在括号后添加小写(
\upicker:UIImagePickerController…
,然后从
AnyObject
更改为
Any
]…
检查以下代码:

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

我遇到了同样的问题。上面提到的建议对我都不起作用。但是,我解决了这个问题,明确地打电话给挑选者。解雇并解雇那个帖子。我不清楚为什么我会做出这样的解雇决定,但它对我起了作用

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

}

我找到了!它试图告诉您您没有“照片”的授权,您需要在Objective-C中包含
#import
并请求授权,例如这样的授权

希望这能为您节省一些时间。我花了整整两天的时间调试这个

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

我相信有人可以告诉您如何在Swift中执行同样的操作。

当您未在
Info.plist
文件中配置照片库的使用权限时,也会发生此错误

您需要在
Info.plist
中添加
隐私-照片库使用说明
,并在应用程序首次尝试访问用户照片库时显示一个字符串

最后的
Info.plist
调整应如下所示:

我阅读了所有这些答案,在这里做了一些修改,不需要放弃,这对我很有用,谢谢其他人的回复

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

我修复了这个问题,调用下面的函数进入viewdidload或ViewWillDisplay或ViewDidDisplay以检查应用程序的权限

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

要使用上述方法,请不要忘记在类的顶部添加
导入照片。

我有相同的错误,我用以下方式修复了它:

以不同方式获取图像对象取决于UIImagePickerController是否允许编辑为true或false

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

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

    ....

}

当然,请按照上面的评论先申请访问照片库的权限。

这解决了我的错误:

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)

}

我找到了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)
    }

我找到了这个解决方案。由于下面提到的这两个原因,我们得到了这个错误

  • 首先,我们需要调用此方法进行授权
  • 授权码

    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.")
      }
    }
    
  • didFinishPickingMediaWithInfo方法调用的正确方式
  • 错误:

    我希望此解决方案将帮助您解决此错误


    如果它对您有效,请不要忘记将其标记为正确,这样将有助于其他人找到正确的方法。

    这可能不是最直接有用的答案,但希望它会有帮助!我99%确信,这个特定的错误消息实际上并没有指出真正的问题。我花了数小时来解决这个问题确切的问题

    1) 当我启动选取器时,我有权将照片打印到控制台上;2)我可以轻松导航并选取照片;3)当我在解除选取器后返回视图时,我的按钮图像没有用新照片更新。。。我对这个问题的唯一提示就是你收到的错误信息

    原来我是在硬编码一个占位符图像在ViewWillDisplay而不是ViewDidLoad。每次选取者解散时,它都会调用viewwillbeen并用我的硬编码图像替换我选择的图像。我已经解决了这个问题,现在一切正常。。。每次从选择器返回时,我都会看到错误消息


    我建议您在ImagePicker之外的其他地方查找您的问题,您可能会找到它。

    单击imageView从照片库加载图像,并在同一imageView上显示预览。在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)
                }
    

    *Swift 3中缺少代表*

    就我而言,所有设置都是正确的:
    1-代表(UIImagePickerControllerDelegate、UINavigationControllerDelegate)
    2-已验证的权限
    3-已经完成的Plist
    4-所有读到的答案,我都做了

    但是我忘记在
    viewDidLoad
    上实现
    pickerview.delegate=self
    因为我从我的另一个viewController复制和粘贴,忘记了这一点


    我希望它能帮助一些人,首先检查你的复制/粘贴

    请按以下步骤检查:

  • 导入照片
  • 有权访问相册:

    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)
        })
    }
    }
    
  • 当前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)
        }
    }
    
  • 关键步骤是,确保委托方法严格遵循

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

  • 尝试了一些组合反应,但没有多大成功

    使用Swift 4,我发现我需要确保实现以下两项,以确保选择图像并将其放入选择器(请注意,“[discovery]在发现扩展时遇到错误:

    错误域=PlugInKit Code=13“查询已取消”UserInfo={NSLocalizedDescription=query cancelled}”

    消息仍会显示在控制台中,但不会阻止您添加图像)。也许这是一条导致挑选者被解雇的信息

    1)
    UIImagePickerController
    的代理是
    (UIImagePickerControllerDelegate&UINavigationControllerDelegate)
    ,因此需要明确添加
    UINavigationControllerDelegate
    作为协议之一:

    class ViewController:UIViewController, UIImagePickerControllerDelegate, 
        UINavigationControllerDelegate { .... }. 
    
    2) 请确保info.p
    // 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)
    }
    
    class ViewController:UIViewController, UIImagePickerControllerDelegate, 
        UINavigationControllerDelegate { .... }. 
    
    class ViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 
        let imagePickerController = UIImagePickerController()
        override func viewDidLoad() {
            super.viewDidLoad()
            imagePickerController.delegate = self
        }
        ...
    }
    
    let picker = UIImagePickerController()
    picker.allowsEditing = true
    picker.sourceType = .photoLibrary
    picker.delegate = self  //Don't forget this line!
    self.present(picker, animated: true, completion: nil)
    
    @objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
    ...
    }
    
    // request photos permission if permission has not been granted
        if PHPhotoLibrary.authorizationStatus() != PHAuthorizationStatus.authorized {
            PHPhotoLibrary.requestAuthorization({ (status: PHAuthorizationStatus) in
    
            })
        }
    
    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)
                }
            }
        }
    
    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)
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
    
    func imagePickerController(...
    
    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
            })
        }
    }
    
    class MyViewController: UIViewController {
        @IBOutlet weak var profileImage: UIImageView!
    
        ...
    }
    
    extension MyViewController: ImagePickerDelegate {
        func didSelect(image: UIImage?) {
            self.profileImage.image = image
        }
    }
    
    open class ImagePicker: NSObject {
        ...
        private func pickerController(_ controller: UIImagePickerController, didSelect image: UIImage?) {
            controller.dismiss(animated: true, completion: {self.delegate?.didSelect(image: image)}
            )
        }
    }
    
    // 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>
    
    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
        }
    }