Swift PhotoPicker发现错误:错误域=PlugInKit代码=13
我试图在UIImageView中显示照片库中的图像 完全错误是: 2017-06-09 21:55:59.063307+0200 firstapp2.0[12873:1120778]光采集器 发现错误:错误域=PlugInKit代码=13“查询已取消” UserInfo={NSLocalizedDescription=查询已取消} 我的代码包括在下面: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
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
}
}