Подтвердить что ты не робот

Ошибка обнаружения 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)
    }
}
4b9b3361

Ответ 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.")
  }
}
  1. Правильный способ вызова вызова 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:

  1. Добавьте необходимые разрешения (другие упомянутые)

  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 и значением отключить