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

问题描述 投票:105回答:34

我想在一个UIImageView显示来自图片库的图像

完整的错误是:

2017年6月9日21:55:59.063307 + 0200 firstapp2.0 [12873:1120778] PhotoPicker发现错误:错误域= 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)
    }
}
swift uiimage ios11
34个回答
36
投票

你需要作出明确的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)
}

7
投票

这修复了斯威夫特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]){}

4
投票

确保你继承两个:UIImagePickerControllerDelegate, UINavigationControllerDelegate

还有,记得设置委托:

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

学分this source


4
投票

我当我试图呈现从选择器回调imagePickerController另一个控制器相同的消息。这为我工作的解决方案是在完成回调内从机械臂驳回方法将我的代码

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

4
投票

找到该问题的补丁花了我一辈子。它看起来像问题是,UIImagePickerControllerDelegate的功能imagePickerController无法找到。如果您已正确设置委派,并将其停止升级到斯威夫特4后的工作,这个问题可能是你没有使用它,因为斯威夫特4需要@objc使其对Objective-C的访问。

它一定要是:

@objc FUNC imagePickerController(...

代替

func imagePickerController(...

4
投票

通过设置图像时设置1秒的延迟固定它。

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 func,然后括号(_ picker: 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)
}

3
投票

这把我难倒了,但在下面的链接的答案为我工作。错误消失了,如预期影像显示器

像上面的答案之一,你必须有(_ picker...但功能之前还@objc

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

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


2
投票

这解决了我的错误:

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
投票

按如下步骤操作请检查:

  1. 导入照片
  2. 先后获得专辑: 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 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. 关键的一步,确保委托方法是一样严格遵循 // 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
投票

这是我做的,它解决了我的问题。

  • 添加@objc
  • 添加内部
  • imagePicker前加_
  • 请确保您所使用的,而不是AnyObject

希望这可以帮助!


17
投票

我找到了!它是想告诉你,你没有权限“的照片”你需要包括,例如,像这样在Objective-C的#import <Photos/Photos.h>并请求授权。

希望这会为你节省一些时间。我花了整整两天调试这个!

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

我相信有人可以告诉你如何做同样的斯威夫特。


2
投票

在我来说,我得到这个错误,因为我在没有首先验证用户是否已允许访问图像呈现的图像拾取控制器。其他地方在我的代码的用户已经授予的权限,所以我认为,所有我需要做的是导入照片。然而,由于它们“可能”没有在这一点上的应用程序添加此获准之前我介绍的图像拾取控制器解决这个问题对我来说(进口照片以及)。

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

        })
    }

如果这个答案似乎是多余的我道歉,但我不得不从几个不同的答案拼凑起来,让我的解决方案的工作。或许这将帮助别人使用雨燕4。


2
投票

使用此代码

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

1
投票

当你没有在你Info.plist文件中配置的图片库的使用的权限的错误也会发生。

您需要在Privacy - Photo Library Usage Description添加Info.plist与当你的应用程序试图第一次访问用户的照片库,将出现一个字符串。

最后Info.plist调整应该是这个样子:enter image description here


1
投票

我有同样的错误,我固定它通过这种方式:

获得方式不同图像对象取决于的UIImagePickerController allowsEditing是真的还是假的

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

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

    ....

}

,当然,请首先访问照片库作为上述评论的权限。


1
投票

在我结束UINavigationControllerDelegate委托丢失。

class YourViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate


1
投票

这个“错误域= PlugInKit码= 13”错误混淆了很多人,即使它似乎是一种无害的苹果调试消息。我有麻烦我拿起我的UI设置,并认为该错误是问题的图像。然而这是一件有点更加微妙。

我有我的文件图像选取器控制器根据真实呈现它的视图控制器分离。

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

大部分的教程和答案都完成设定为零。但是,如果你设置完成零,并分别调用该委托的didSelect方法,该方法被调用,但图像没有设定所以一定要使用解雇完成。

再次,我知道这个答案可能并不直接与原来的问题,但我有一种感觉,很多人都来这里这个问题,并给出解决方案没有帮助。其原因是,大多数人给出的答案都在同一类的图像拾取控制器作为其主视图控制器,因此不需要使用完毕。


0
投票

我碰到了同样的问题。上面提到的建议没有为我工作。不过,我决定了,由explicilty调用picker.dismiss和罢免职位,。我不明白为什么我做出开除这样的电话,但它为我工作。

   @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
投票

我读了所有这些问题的答案,并在此处修改点点,而不是解雇需要,这为我工作,感谢别人谁在这里回答。

    @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
投票

我发现图像PickerView的解决方案.....

@IBOutlet weak var myImageView: UIImageView!

var imagePicker = UIImagePickerController()


  @IBAction func selectImage(_ sender: Any) {

        let myPickerController = UIImagePickerController()
        myPickerController.delegate = self;
        myPickerController.sourceType = UIImagePickerControllerSourceType.photoLibrary

        self.present(myPickerController, animated: true, completion: nil)

    }

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

        var selectedImageFromPicker: UIImage?

        if let editedImage = info["UIImagePickerControllerEditedImage"] as? UIImage
        {
            selectedImageFromPicker = editedImage as! UIImage


        }else if let originalImage = info["UIImagePickerControllerOriginalImage"] as? UIImage{

            selectedImageFromPicker = originalImage as! UIImage


        }

        dismiss(animated: true, completion: nil)

        if var selectedImage = selectedImageFromPicker
        {
            myImageView.image = selectedImage
        }

    }

    func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
        picker.dismiss(animated: true, completion: nil)
    }

0
投票

点击ImageView的,从照片库中加载图像,并显示在同一个ImageView的预览。上迅速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)
            }

16
投票

我发现这个解决方案。我们得到这个错误是由于其在下文提到的这两个原因。

  1. 首先,我们需要在调用此方法进行授权

授权码

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. didFinishPickingMediaWithInfo的方法呼唤的正确方法

错误:

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

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

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

如果你的作品,不要忘记,以纪念它作为一个正确的,所以这将有助于其他找到正确的方法。


0
投票

对雨燕4.2和10.0 Xcode中同样的问题。虽然图像拾取器正确工作的Xcode显示在控制台上此错误。为了摆脱这样的:

  • 在Xcode的菜单产品>方案>编辑方案
  • 选择“运行”选项卡,然后“参数”
  • 在“环境变量”部分添加一个变量名称OS_ACTIVITY_MODE和值禁用

15
投票

尝试了几个组合响应但没有成功。

用斯威夫特4,我发现我需要确保实施了以下两个项目,以确保图像选择和放置到选择器(注意,遇到了“[发现]的错误,同时发现扩展:

误差区域= PlugInKit代码= 13 “的查询取消” 的UserInfo = {NSLocalizedDescription =查询取消}”

消息仍显示在控制台中,但它不会阻止您添加图像)。也许这就是被解雇导致机械臂的消息?

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

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

2)确保info.plist中有Privacy - Photo library Usage Description键和字符串值集。

当然,你需要确保你创建一个UIImagePickerController并设置其委托等于在selfViewDidLoad()

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

11
投票

下面我解决了这个问题,通话功能到viewDidLoad中或viewWillAppear中或viewDidAppear检查同意您的应用程序。

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

并利用上述方法,不要忘了在类的顶部添加import Photos


10
投票

XCODE 10.1 / 4.2 SWIFT:

  1. 添加所需的权限(别人提到)
  2. 实现此委托FUNC: 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) }

9
投票

*缺少DELEGATE *斯威夫特3 就我而言,所有的设置是正确的: 1 - 代表(UIImagePickerControllerDelegate,UINavigationControllerDelegate); 2 - 权限已经核实; 3 - plist中已经完成; 4 - 一切都在这个答案读,我做;

但我忘了落实pickerview.delegate = self viewDidLoad因为我复制和我的其他的viewController PASTE,忘记了!

我希望它帮助别人,先回顾一下你的复制/粘贴!


8
投票

这可能不是最直接有用的答案 - 但希望这将有助于!我99%肯定,这个特殊的错误消息是不实际指向你真正的问题。我花了几个小时拉我的头发在此完全相同的问题。

1)我有照片打印到时我启动我的选择器控制台,2)我可以浏览和挑选照片很容易,和3)时,我会在驳回选择器返回我对我的看法授权,我的按钮图像没有更新与新的照片...和我的问题是,您收到确切的相同的错误消息的唯一线索。

原来我是硬编码在viewWillAppear中,而不是viewDidLoad中的占位符图像。每次选择器被解雇,这是调用viewWillAppear中,并用我的硬编码图像替代我所选择的图像。我固定的问题,果然 - 一切正常......现在,我每一次我从选择器返回时仍然看到错误消息。

我建议找比ImagePicker问题的其他地方,你可能会发现它。


7
投票

如果你还没有这样做,尝试this

产品>方案>编辑计划>环境变量OS_ACTIVITY_MODE: disable

它解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.