Ошибка обнаружения PhotoPicker: домен ошибки = код PlugInKit = 13

118

Я пытаюсь отобразить изображение из библиотеки фотографий в 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)
    }
}
Крисон Найду
источник
11
У меня такая же ошибка. вы используете бета-версию Xcode 9, iOS 11?
Джон
4
Раньше это работало ... а затем iOS 11 Beta 4 внезапно выдала мне эту ошибку. Так странно.
user2153553
2
Я получаю ту же ошибку, и моя реализация находится в obj-c. Это сообщение об ошибке не может быть связано с приведением типа информационного словаря, возвращенного в методе делегата UIImagePicker в объекте-c: - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)infoзначения словаря приводятся как id в obj-c. Я также реализовал запрос на авторизацию и обработку для доступа к библиотеке фотографий пользователя: сообщение об ошибке все еще появляется. Я добавил в файл info.plist запись о конфиденциальности для использования библиотеки фотографий пользователя.
valeCocoa 06
2
У меня текущая ошибка, но это не мешает мне получить изображение из библиотеки и использовать его позже ..
shokuroff
3
Я попробовал все предложения во всех ответах вместе, но безрезультатно.
Николас Миари

Ответы:

39

Вам нужно сделать явную ссылку на 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)
}
Роберт Дешрайвер
источник
6
Работает для меня. Я недавно обновился до Swift 4 и Xcode 9, и это решило проблему.
user3144836 08
3
Работает для меня. Требуется после перехода на Swift 4.0.
mayankk2308
4
Не работает. Эта ошибка произошла после того, как я позвонил dismiss.
Кими Чиу
Странный. Это сработало для меня, однако xcode помечает это как предупреждение и ожидает сигнатуру: `Instance method 'imagePickerController ( : didFinishPickingMediaWithInfo :)' почти соответствует необязательному требованию 'imagePickerController ( : didFinishPickingMediaWithInfo :)' протокола 'UIImagePickerControllerDelegate' MakePickerControllerDelegate 'MakePickerControllerDelegate : didFinishPickingMediaWithInfo :) 'закрыто, чтобы заглушить это предупреждение'
Dark Castle
@DarkCastle вам нужно записать функцию в extension [your class name]блок вне класса.
Prometheos II
18

Я нашел это решение. Мы получили эту ошибку из-за этих двух причин, упомянутых ниже.

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

Надеюсь, это решение поможет вам устранить эту ошибку.

Если это сработает, не забудьте пометить его как правильный, это поможет другим найти правильный путь.

user3159598
источник
Нуб PSA: PHPhotoLibrary из модуля Swift Photos
Брейден Холт,
Не работает. Ошибка возникает после звонкаpicker.dismiss(animated: true, completion: nil)
ForceBru
17

Я нашел это! Он пытается сказать вам, что у вас нет авторизации для "фотографий". Вам нужно включить #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.

Роберт Wohnoutka
источник
1
обязательно укажите #import <Photos / Photos.h>
Роберт Вохноутка,
6
Это не устранило мою проблему.
fi12 02
1
Я получаю в консоли следующее сообщение: «Чтение из частных эффективных пользовательских настроек. Ошибки, обнаруженные при обнаружении расширений: Error Domain = PlugInKit Code = 13», запрос отменен, UserInfo = {NSLocalizedDescription = запрос отменен} ». Это не решило проблему.
Biranchi
15

Пробовали несколько комбинационных ответов без особого успеха.

Используя Swift 4, я обнаружил, что мне нужно убедиться, что были реализованы следующие два элемента, чтобы изображение было выбрано и помещено в средство выбора (обратите внимание, что при обнаружении расширений возникли ошибки «[обнаружение]:

Ошибка домена = PlugInKit Code = 13 "запрос отменен" UserInfo = {NSLocalizedDescription = запрос отменен} "

сообщение по-прежнему отображается в консоли, но это не мешает вам добавить изображение). Может быть, это сообщение приводит к закрытию сборщика?

1) Делегат для UIImagePickerControlleris (UIImagePickerControllerDelegate & UINavigationControllerDelegate)?поэтому должен явно добавить в UINavigationControllerDelegateкачестве одного из протоколов:

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

2) Убедитесь, что в info.plist заданы Privacy - Photo library Usage Descriptionключ и значение String.

Конечно, вам нужно убедиться, что вы создали UIImagePickerControllerи установили его делегат равным selfin ViewDidLoad():

class ViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 
    let imagePickerController = UIImagePickerController()
    override func viewDidLoad() {
        super.viewDidLoad()
        imagePickerController.delegate = self
    }
    ...
}
Г. Рейнольдс-Титко
источник
4
У меня все это есть в моем проекте ... но это не работает
Мохамед Ли
Спасибо, я пропустил настройку делегата в viewDidLoad ()
Аршад Шайк
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в начало класса.

logan.Nguyen
источник
11

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)
    }
FRIDDAY
источник
1
Истинный способ использования функции imagePickerController на Swift 4x
Самет Сазак
10

* Отсутствует DELEGATE * в Swift 3

В моем случае все настройки были правильными:
1 - Делегаты (UIImagePickerControllerDelegate, UINavigationControllerDelegate);
2 - Разрешения уже проверены;
3 - Plist уже готов;
4 - Я прочитал все, что читал в ответах;

Но я забыл реализовать pickerview.delegate = selfна viewDidLoad Потому что я копировать и вставлять из другого ViewController и забыть , что!

Надеюсь, это кому-нибудь поможет, сначала просмотрите свою КОПИЮ / ВСТАВКУ !!!

Даниэль Арантес Ловерде
источник
Спасибо, я долго
борюсь,
Рад помочь :)
Даниэль Арантес Ловерде
8

Возможно, это не самый полезный ответ, но, надеюсь, он поможет! Я на 99% уверен, что это конкретное сообщение об ошибке на самом деле не указывает вам на настоящую проблему. Я часами выдергивал волосы из-за той же самой проблемы.

1) у меня было разрешение на печать фотографий на консоли, когда я запускал средство выбора, 2) я мог достаточно легко перемещаться и выбирать фотографию, и 3) когда я возвращался в свое представление после закрытия средства выбора, мое изображение кнопки не был обновлен с новой фотографией ... и единственный намек на проблему, который у меня был, был точно такое же сообщение об ошибке, которое вы получаете.

Оказывается, я жестко кодировал изображение-заполнитель во ViewWillAppear вместо ViewDidLoad. Каждый раз, когда средство выбора отклонялось, оно вызывало ViewWillAppear и заменяло выбранное мной изображение на мое жестко закодированное изображение. Я исправил эту проблему и, конечно же, теперь все работает нормально ... и я все еще вижу это сообщение об ошибке каждый раз, когда возвращаюсь из средства выбора.

Я рекомендую поискать решение вашей проблемы где-нибудь, кроме ImagePicker, и вы наверняка ее найдете.

Леви Лаис
источник
7

Если вы этого не сделали, попробуйте это .

Продукт> Схема> Изменить схему> Переменные среды OS_ACTIVITY_MODE: disable

Это решает мою проблему.

Чаннам Хонг
источник
23
Это подавляет сообщения об ошибках, но не устраняет их причину. Он также подавляет другие системные сообщения и все от NSLog.
Джон Монтгомери
6
Это не «решает» проблему, а просто делает ее невидимой. Очень плохая практика.
zeeshan 03
Это то же самое, что прятать грязь под ковриком tbh
shiv
7

Это устраняет проблему в 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]){}
user2153553
источник
Моя ошибка выглядела примерно так: ошибки, обнаруженные при обнаружении расширений: Error Domain = PlugInKit Code = 13 "query отменен" UserInfo = {NSLocalizedDescription = query отменен} И это решило мою проблему, хотя я не могу говорить, помогает ли это OP , Спасибо :)
agrippa 05
6

Я получил то же сообщение, когда пытался представить другой контроллер из обратного вызова средства выбора 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)
            }
        }
    }
Марио Василе
источник
Отличный ответ, вы сэкономили мне время 👍🏼
Coder ACJHP
Сработало замечательно! Думаю, это правильный способ справиться с ошибками средства выбора в Swift 4.x.
shiv
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)

Кредиты этому источнику .

Райан
источник
picker.delegate = self - это был мой случай! Спасибо.
Алексей Чеканов
4

На поиск решения этой проблемы у меня ушла вечность. Похоже, проблема в том, что функция imagePickerController из UIImagePickerControllerDelegate не может быть найдена. Если вы правильно настроили делегат и он перестал работать после обновления до Swift 4, проблема, вероятно, в том, что вы не сделали его доступным для Objective-C с помощью @objc, который требуется со времен Swift 4.

Должно быть:

@objc func imagePickerController (...

вместо того

func imagePickerController(...
Apfelsaft
источник
Это создает ошибкуObjective-C method 'imagePickerController:didFinishPickingMediaWithInfo:' provided by method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' conflicts with optional requirement method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' in protocol 'UIImagePickerControllerDelegate'
Нико Нил
Собственно, это способ исправить!
Мария Ортега
@NicoNeill вы добавили функцию в extensionблок?
Prometheos II
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

EGibson
источник
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)

}
iOS-разработчик
источник
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)
    }
xuzepei
источник
2

Это то, что я сделал, и это решило мою проблему.

  • добавить @objc
  • добавить внутренний
  • добавить _ перед imagePicker
  • убедитесь, что вы используете Any, а не AnyObject

Надеюсь это поможет!

FreitDev
источник
Хм, internalэто по умолчанию; Интересно, какая разница, чтобы указать это ...
Николас Миари
2

В моем случае я получал эту ошибку, потому что представлял контроллер средства выбора изображений без предварительной проверки, разрешил ли пользователь доступ к изображениям. В другом месте моего кода пользователь предоставил разрешение, поэтому я думаю, все, что мне нужно было сделать, это импортировать фотографии. Однако, поскольку они «могли» не предоставить разрешение в этот момент в приложении, добавив это непосредственно перед тем, как я представил контроллер выбора изображений, проблема была решена для меня (также импорт фотографий).

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

        })
    }

Если этот ответ кажется излишним, приношу свои извинения, но мне пришлось собрать воедино несколько разных ответов, чтобы мое решение заработало. Возможно, это поможет кому-то другому, использующему Swift 4.

Джейсон Рыбка
источник
2

используйте этот код

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
jaskiratjd
источник
2

Эта ошибка «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 '.

И снова я знаю, что этот ответ может не иметь прямого отношения к исходному вопросу, но я чувствую, что многие люди приходят сюда по этой проблеме, и данные решения не помогают. Причина в том, что большинство людей, дающих ответы, имеют свой контроллер выбора изображений в том же классе, что и их главный контроллер представления, и, следовательно, не нуждаются в завершении.

Брейден Холт
источник
Это именно то, что мне нужно. Спасибо!
AJ Hernandez
1

Ошибка также возникает, если вы не настроили разрешения на использование библиотеки фотографий в себе.Info.plist файле.

Вам нужно добавить Privacy - Photo Library Usage Descriptionв Info.plistс строкой , который будет отображаться , когда ваш App пытается в первый раз , чтобы получить доступ к библиотеке фотографий пользователя.

Окончательные Info.plistнастройки должны выглядеть примерно так: введите описание изображения здесь

Знание
источник
1

У меня такая же ошибка, и я исправил ее следующим образом:

получить объект изображения по-разному зависит от UIImagePickerController allowEditing истинно или ложно

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

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

    ....

}

И, конечно же, сначала попросите разрешения на доступ к библиотеке фотографий, как указано выше.

melson.jao
источник
1

С моей стороны UINavigationControllerDelegateотсутствует делегат.

class YourViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate

Алим
источник
1

В моем случае управление памятью быстрого распределения кажется оптимизированным и исправленным командой Apple. Мой код отлично работал до быстрого обновления, и я обнаружил, что моя «ошибка» заключалась в том, что я не сохранял средство выбора, но он работал целую вечность без сохранения, так что здесь полное готовое к работе решение.

// 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
    }
}
Benpaper
источник
0

Я столкнулся с той же проблемой. Ни одно из вышеупомянутых предложений не помогло мне. Однако я решил это, явно вызвав 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!)
    }

}
Vyshakh
источник
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

я нашел решение 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)
    }
Мухаммад Хамид
источник
0

щелкните изображение, чтобы загрузить изображение из библиотеки фотографий и просмотреть его в том же окне просмотра. на 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)
            }
Рошан Посакья
источник