Ошибка обнаружения PhotoPicker: Ошибка Домен = Код PlugInKit = 13
Я пытаюсь отобразить изображение из библиотеки фотографий в UIImageView
Полная ошибка:
2017-06-09 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)
}
}
Ответы
Ответ 1
Вам нужно сделать явную ссылку 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)
}
Ответ 2
Я нашел его! Он пытается сказать вам, что у вас нет разрешения на "фотографии". Вам нужно включить #import <Photos/Photos.h>
и запросить авторизацию, например, как в Objective-C.
Надеюсь, это сэкономит вам время. Я провел два полных дня, отлаживая это!
[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.
Ответ 3
Я нашел это решение. Мы получили эту ошибку из-за этих двух причин, о которых говорится ниже.
- Сначала нам нужно вызвать этот метод для авторизации
Код авторизации
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]) {
}
Right
@objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
}
Я надеюсь, что это решение поможет вам устранить эту ошибку.
Если это работает для вас, не забудьте отметить его как правильное, так что это поможет другому найти правильный путь.
Ответ 4
Пробовал несколько комбинационных ответов без особого успеха.
Используя Swift 4, я обнаружил, что мне нужно убедиться, что следующие два элемента были реализованы для обеспечения того, чтобы изображение было выбрано и помещено в сборщик (обратите внимание, что при обнаружении расширений обнаружены ошибки [обнаружения]:
Ошибка домена = Код PlugInKit = 13 "отменен запрос" UserInfo = {NSLocalizedDescription = запрос отменен} "
В консоли все еще отображается сообщение но это не мешает вам добавить изображение). Может быть, это сообщение, которое приводит к увольнению сборщика?
1) Делегат для UIImagePickerController
равен (UIImagePickerControllerDelegate & UINavigationControllerDelegate)?
, поэтому необходимо явно добавить UINavigationControllerDelegate
в качестве одного из протоколов:
class ViewController:UIViewController, UIImagePickerControllerDelegate,
UINavigationControllerDelegate { .... }.
2) Убедитесь, что у info.plist есть ключ Privacy - Photo library Usage Description
и значение String.
Конечно, вам нужно убедиться, что вы создаете UIImagePickerController
и установите его делегат равным self
в ViewDidLoad()
:
class ViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
let imagePickerController = UIImagePickerController()
override func viewDidLoad() {
super.viewDidLoad()
imagePickerController.delegate = self
}
...
}
Ответ 5
Я исправил эту проблему, вызвав функцию ниже в 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
в верхней части класса.
Ответ 6
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)
}
Ответ 7
* Отсутствует DELEGATE * в Swift 3
В моем случае все настройки были правильными:
1 - Делегаты (UIImagePickerControllerDelegate, UINavigationControllerDelegate),
2 - Разрешения уже проверены;
3 - Плист уже сделал,
4 - Все, прочитанное в этом ответе, я сделал;
Но я забыл реализовать pickerview.delegate = self
на viewDidLoad
Потому что я COPY и PASTE из моего другого viewController и забудьте об этом!
Я надеюсь, что это поможет кому-то, сначала просмотрите свою COPY/PASTE!!!
Ответ 8
Это может быть не самый удобный ответ, но, надеюсь, это поможет! Я на 99% уверен, что это конкретное сообщение об ошибке на самом деле не указывает на реальную проблему. Я потратил несколько часов, вытаскивая свои волосы по этой же самой точной проблеме.
1) У меня было разрешение на печать фотографий на консоль, когда я запустил свой сборщик, 2) Я мог легко перемещаться и выбирать фотографию достаточно легко, и 3) когда я верну свое мнение, отклонив сборщик, изображение моей кнопки не было обновлено новой фотографией... и единственным намеком, который я имел к проблеме, было то же сообщение об ошибке, которое вы получаете.
Оказывается, я жестко кодировал образ заполнителя в ViewWillAppear вместо ViewDidLoad. Каждый раз, когда сборщик увольнялся, он вызывал ViewWillAppear и заменял мое выбранное изображение жестким кодированным изображением. Я исправил эту проблему и, конечно же, все хорошо работает... и я все еще вижу это сообщение об ошибке каждый раз, когда я возвращаюсь из сборщика.
Я рекомендую посмотреть где-то, кроме ImagePicker, на вашу проблему, и вы, скорее всего, найдете его.
Ответ 9
Если вы этого не сделали, попробуйте это.
Продукт> Схема> Редактировать схему> Переменные среды OS_ACTIVITY_MODE: disable
Это решает мою проблему.
Ответ 10
Это устраняет проблему в 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]){}
Ответ 11
Убедитесь, что вы подклассифицируете оба: 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)
Кредиты на этот источник.
Ответ 12
Я получил то же сообщение, когда пытался представить другой контроллер из функции обратного вызова средства 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)
}
}
}
Ответ 13
Поиск решения этой проблемы занял у меня навсегда. Похоже, проблема в том, что функция imagePickerController объекта UIImagePickerControllerDelegate не может быть найдена. Если вы правильно установили делегат и он перестал работать после обновления до Swift 4, возможно, проблема в том, что вы не сделали его доступным для Objective-C с помощью @objc, который требуется с Swift 4.
Должно быть:
@objc func imagePickerController (...
вместо
func imagePickerController(...
Ответ 14
Исправлено это путем установки 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
})
}
}
Ответ 15
Обязательно добавьте 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)
}
Ответ 16
Это поставило меня в тупик, но ответ по ссылке ниже работал для меня. Ошибка исчезла, и изображение отображается как ожидалось
Как и в случае с одним из приведенных выше ответов, вы должны иметь (_ picker...
но также @objc
перед функцией.
@objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
...
}
https://forums.developer.apple.com/thread/82105
Ответ 17
Это решило мою ошибку:
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)
}
Ответ 18
Пожалуйста, выполните следующие действия:
- Импорт фотографий
-
Имеет доступ к альбому:
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)
}
Ответ 19
Это то, что я сделал, и это решило мою проблему.
- добавить @objc
- добавить внутренний
- добавить _ перед imagePicker
- убедитесь, что вы используете Any, а не AnyObject
Надеюсь это поможет!
Ответ 20
В моем случае я получал эту ошибку, потому что представлял контроллер средства выбора изображений без предварительной проверки, разрешил ли пользователь доступ к изображениям. В другом месте моего кода пользователь дал разрешение, поэтому я думаю, что все, что мне нужно было сделать, это импортировать фотографии. Тем не менее, так как они "возможно" не предоставили разрешения в этот момент в приложении, добавив его непосредственно перед тем, как я представил контроллер выбора изображений, я решил эту проблему (также импортировал фотографии).
// request photos permission if permission has not been granted
if PHPhotoLibrary.authorizationStatus() != PHAuthorizationStatus.authorized {
PHPhotoLibrary.requestAuthorization({ (status: PHAuthorizationStatus) in
})
}
Если этот ответ кажется излишним, мои извинения, но мне пришлось собрать несколько разных ответов, чтобы мое решение работало. Возможно, это поможет кому-то еще, используя Swift 4.
Ответ 21
используйте этот код
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
Ответ 22
Ошибка также возникает, если вы не настроили разрешения на использование библиотеки фотографий в файле Info.plist
.
Вам нужно добавить Privacy - Photo Library Usage Description
в Info.plist
со строкой, которая появится, когда ваше приложение впервые попытается получить доступ к Библиотеке фотографий пользователя.
Окончательные корректировки Info.plist
должны выглядеть примерно так:
![введите описание изображения здесь]()
Ответ 23
У меня такая же ошибка, и я исправил ее следующим образом:
получить объект изображения по-разному зависит от UIImagePickerController allowEditing - true или false
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if isImagePickerAllowEditing {
sourceImage = info[UIImagePickerControllerEditedImage] as? UIImage
} else {
sourceImage = info[UIImagePickerControllerOriginalImage] as? UIImage
}
....
}
И, конечно, попросите разрешения сначала получить доступ к библиотеке фотографий, как указано выше.
Ответ 24
На моем конце UINavigationControllerDelegate
делегат отсутствует.
class YourViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate
Ответ 25
Эта ошибка "Error Domain = PlugInKit Code = 13" сбила с толку многих людей, даже несмотря на то, что она выглядит как безопасное сообщение об отладке Apple. У меня были проблемы с получением изображения, которое я выбрал для установки в своем пользовательском интерфейсе, и подумал, что эта ошибка была проблемой, однако это было что-то более тонкое.
У меня есть мой контроллер выбора изображения в файле, отдельном от контроллера представления, который представляет его.
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 и вызвали метод делегата didSelect отдельно, метод вызывается, но изображение не устанавливается, поэтому обязательно используйте завершение dismiss.
И опять же, я знаю, что этот ответ может не иметь прямого отношения к первоначальному вопросу, но у меня есть ощущение, что многие люди приходят сюда для решения этой проблемы, и данные решения не помогают. Причина в том, что большинство людей, отвечающих на вопросы, имеют свой контроллер выбора изображений того же класса, что и контроллер основного вида, и, следовательно, не нуждаются в использовании завершения.
Ответ 26
Я столкнулся с той же проблемой. Ни одно из вышеупомянутых предложений не работало для меня. Тем не менее, я решил это, объяснив, вызывая 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!)
}
}
Ответ 27
Я прочитал все эти ответы и немного изменил здесь и не нуждался в увольнении, это сработало для меня, спасибо другим, которые здесь ответили.
@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
}
}
Ответ 28
я нашел решение 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)
}
Ответ 29
щелкните по изображению, чтобы загрузить изображение из библиотеки фотографий и показать предварительный просмотр на том же изображении. на быстрых 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)
}
Ответ 30
Была такая же проблема на Swift 4.2 и Xcode 10.0. Хотя средство выбора изображений работало правильно, Xcode показывал эту ошибку на консоли. Чтобы избавиться от этого:
- В меню Xcode Product> Scheme> Edit Scheme
- Выберите вкладку "Выполнить", затем "Аргументы"
- В разделе "Переменные среды" добавьте переменную с именем OS_ACTIVITY_MODE и значением отключить