フォトライブラリの画像をUIImageViewに表示しようとしています
完全なエラーは次のとおりです。
2017-06-09 21:55:59.063307 + 0200 firstapp2.0 [12873:1120778] PhotoPicker検出エラー:エラードメイン= PlugInKit Code = 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)
}
見つけた!それはあなたが "photos"に対する権限を持っていないことをあなたに伝えようとしていますあなたは#import <Photos/Photos.h>
を含めて、例えばObjective-Cのように権限を要求する必要があります。
これが時間を節約することを願っています。私はこれをデバッグするのに2日かけて過ごしました!
[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で同じことをする方法をあなたに言うことができると確信しています。
私はこの解決策を見つけました。下記の2つの理由により、このエラーが発生しました。
認証コード
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
の呼び出し間違った:
private func imagePickerController( picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
}
右
@objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
}
この解決策がこのエラーを解決するのに役立つことを願っています。
それがあなたのために働くならば、それが正しいものとしてマークすることを忘れないでください、それでこれは他の人に正しい方法を見つけるのを助けます。
あまり成功せずに組み合わせ反応のいくつかを試みました。
Swift 4を使用して、イメージが選択されてピッカーに配置されるようにするために、次の2つの項目が実装されていることを確認する必要がありました。
エラードメイン= PlugInKit Code = 13 "クエリがキャンセルされました" UserInfo = {NSLocalizedDescription =クエリがキャンセルされました} "
それでもメッセージはコンソールに表示されますが、画像を追加できなくなるわけではありません。たぶん、これはピッカーが解雇されるというメッセージです。
1)UIImagePickerController
のデリゲートは(UIImagePickerControllerDelegate & UINavigationControllerDelegate)?
なので、プロトコルの1つとしてUINavigationControllerDelegate
を明示的に追加する必要があります。
class ViewController:UIViewController, UIImagePickerControllerDelegate,
UINavigationControllerDelegate { .... }.
2)info.plistにPrivacy - Photo library Usage Description
キーとString値が設定されていることを確認してください。
もちろん、必ずUIImagePickerController
を作成し、そのデリゲートをViewDidLoad()
のself
と等しく設定する必要があります。
class ViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
let imagePickerController = UIImagePickerController()
override func viewDidLoad() {
super.viewDidLoad()
imagePickerController.delegate = self
}
...
}
私はこの問題を修正しました、あなたのアプリのための許可をチェックするために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
を追加することを忘れないでください。
*不足しているデリゲート* Swift 3では
私の場合、すべての設定は正しかった。
1 - デリゲート(UIImagePickerControllerDelegate、UINavigationControllerDelegate);
2 - 権限はすでに検証されています。
3 - plistは既に行われています。
4 - このAnswersに書かれているすべてのこと、私はしました。
しかし、私はviewDidLoad
にpickerview.delegate = self
を実装するのを忘れていました。なぜなら、私は自分の他のviewControllerからCOPYしてPASTEして、それを忘れたからです!
それが誰かに役立つことを願っています、あなたのCOPY/PASTEを最初に見直してください!
これは最も直接的に役立つ答えではないかもしれません - しかしうまくいけばそれは役立つでしょう!私は99%がこの特定のエラーメッセージが実際にあなたに本当の問題を示していないことを確信しています。私はこの同じ問題で私の髪の毛を引き出すのに何時間も費やしました。
1)ピッカーを起動したときにコンソールに写真を印刷する権限を持っていたこと、2)写真を簡単にナビゲートしてピッキングできたこと、および3)ピッカーを閉じるとビューに戻ったときのボタンの画像新しい写真で更新されませんでした...そして私が問題に持っていたという唯一のヒントはあなたが受けているのと全く同じエラーメッセージでした。
実のところ、ViewDidLoadではなくViewWillAppearでプレースホルダ画像をハードコーディングしていました。ピッカーが却下するたびに、ViewWillAppearを呼び出して、選択した画像をハードコードされた画像に置き換えました。私はその問題を修正し、そして十分に確かにしました - すべてが現在うまく働いています...そして私はまだピッカーから戻るたびにそのエラーメッセージを見ています。
私はあなたの問題のためにImagePicker以外の場所を探すことをお勧めします、そしてあなたはおそらくそれを見つけるでしょう。
XCODE 10.1/Swift 4.2:
必要な権限を追加します(他の人が言及しました)
このデリゲート関数を実装します。
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)
}
これは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]){}
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)
ピッカーコールバックimagePickerController
から別のコントローラを表示しようとしたときにも同じメッセージが表示されました。私のために働いた解決策は、picker dismissメソッドからの完了コールバックの中に自分のコードを移動することでした。
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)
}
}
}
これで私は困惑しましたが、下のリンクの答えが私のために働きました。エラーがなくなり、イメージが期待どおりに表示される
上記の答えの1つと同様に、関数の前に(_ picker...
だけでなく@objc
も必要です。
@objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
...
}
必ず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)
}
この問題に対する修正を見つけることは私を永遠に連れて行きました。問題は、UIImagePickerControllerDelegateの関数imagePickerControllerが見つからないことです。あなたがデリゲートを正しく設定し、Swift 4へのアップグレード後にそれが動作を停止した場合、問題はおそらくSwift 4以降で必要とされる@objcを使用してObjective-Cにアクセス可能にしなかったことです。
それはする必要があります:
@objc func imagePickerController(...
の代わりに
func imagePickerController(...
私の場合は、ユーザーが画像へのアクセスを許可されているかどうかを最初に確認せずに画像ピッカーコントローラを表示していたため、このエラーが発生していました。私のコード内の他の場所でユーザーが許可を与えていたので、必要なのは写真のインポートだけです。しかし、私はイメージピッカーコントローラを提示する直前にアプリを追加してアプリのその時点で許可を与えていなかったかもしれないので(私たちにとってもImport Photos)。
// request photos permission if permission has not been granted
if PHPhotoLibrary.authorizationStatus() != PHAuthorizationStatus.authorized {
PHPhotoLibrary.requestAuthorization({ (status: PHAuthorizationStatus) in
})
}
もしこの答えが私の謝罪を冗長にしているように思われるならば、私は私の解決策を機能させるためにいくつかの異なる答えから一緒にしなければなりませんでした。おそらくこれは他の人がSwift 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
})
}
}
これが私がしたことで、私の問題は解決しました。
お役に立てれば!
このコードを使う
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
次の手順で確認してください。
アルバムにアクセスできます。
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)
}
これは私のエラーを解決しました:
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)
}
この「Error Domain = PlugInKit Code = 13」エラーは、無害なAppleデバッグメッセージのように見えても、多くの人々を混乱させています。 UIで設定するために選んだ画像を取得するのに問題があり、そのエラーが問題であると思っていましたが、それはもう少し微妙なものでした。
イメージピッカーコントローラーは、それを表示するView Controllerとは別のファイルにあります。
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)}
)
}
}
チュートリアルと回答のほとんどは、完了がnilに設定されています。ただし、完了をnilに設定し、デリゲートのdidSelectメソッドを個別に呼び出すと、メソッドは呼び出されますが、画像は設定されないため、必ず「完了」完了を使用してください。
繰り返しますが、この答えは元の質問に直接関連していないかもしれませんが、この問題のために多くの人々がここに来ており、与えられた解決策が役に立たないと感じています。理由は、答えを出す人のほとんどが、メインビューコントローラと同じクラスのイメージピッカーコントローラを持っているため、補完を使用する必要がないためです。
私の最後にはUINavigationControllerDelegate
デリゲートがありません。
class YourViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate
私は同じエラーがあり、私はこの方法でそれを修正しました:
異なる方法で画像オブジェクトを取得するには、UIImagePickerControllerのpermitEditingがtrueまたはfalseに依存します。
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if isImagePickerAllowEditing {
sourceImage = info[UIImagePickerControllerEditedImage] as? UIImage
} else {
sourceImage = info[UIImagePickerControllerOriginalImage] as? UIImage
}
....
}
そしてもちろん、上のコメントのように最初にフォトライブラリにアクセスする許可を求めてください。
Swift 5以降:
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
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
guard let image = info[.editedImage] as? UIImage else { return }
dismiss(animated: true)
chosenImage = image
**pic.image = chosenImage**
}
@IBAction func tap(_ sender: Any) {
self.text.text = "Kreason"
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
//imagePicker.dataSource = self
imagePicker.allowsEditing = false
self.present(imagePicker, animated: true)
}
}
私は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)
}
DidFinishPickingMediaWithInfoを使用する
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
self.dismiss(animated: true, completion: nil)
var chosenImage = info[UIImagePickerController.InfoKey.editedImage] as! UIImage
userProfileImage.image = chosenImage
uploadImage(chosenImage)
}
私は同じ問題に出くわした。上記の提案のどれも私のために働かなかった。しかし、私はそれを明確に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!)
}
}
私の場合、Swift割り当てメモリ管理はApple Teamによって最適化および修正されているようです。 Swift更新まで私のコードは完全に機能していましたが、ピッカーを保持していないという「間違い」が見つかりました。
// 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
}
}
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)
}
私はすべてのこれらの答えを読み、ここで少し修正して却下する必要はありませんでした、これは私のために働きました。
@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
}
}
メソッド内でUIImagePickerControllerを作成するのではなく、クラス変数として作成し、一度だけ作成するようにしてください。
UIImagePickerControllerにデリゲートを設定するのを忘れたとき、私はあなたと同じ問題を抱えていました
Swift 4.2 および Xcode 10.0 にも同じ問題がありました。画像ピッカーは正常に動作していましたが、Xcodeはこのエラーをコンソールに表示しました。これを取り除くために: