create - uiimageview set image swift
Error de descubrimiento de PhotoPicker: Dominio de error=Código PlugInKit=13 (30)
Estoy tratando de mostrar una imagen de la biblioteca de fotos en un UIImageView
El error completo es:
2017-06-09 21: 55: 59.063307 + 0200 firstapp2.0 [12873: 1120778] Error de descubrimiento de PhotoPicker: Error Dominio = Código PlugInKit = 13 "consulta cancelada" UserInfo = {NSLocalizedDescription = consulta cancelada}
Mi código se incluye a continuación:
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)
}
}
¡Lo encontré!
Está tratando de decirle que no tiene autorización para "fotos". Debe incluir
#import <Photos/Photos.h>
y solicitar autorización, por ejemplo, como esta en Objective-C.
Espero que esto te ahorre algo de tiempo. ¡Pasé dos días completos depurando esto!
[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;
}
}];
Estoy seguro de que alguien puede decirte cómo hacer lo mismo en Swift.
Asegúrese de agregar
internal func
al principio y luego agregue las minúsculas después del paréntesis (
_ picker: UIImagePickerController…
y luego cambie de
AnyObject
a
Any
] ...
Verifique el código a continuación:
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)
}
Asegúrese de subclasificar ambos:
UIImagePickerControllerDelegate, UINavigationControllerDelegate
.
Además, recuerde configurar el delegado:
let picker = UIImagePickerController()
picker.allowsEditing = true
picker.sourceType = .photoLibrary
picker.delegate = self //Don''t forget this line!
self.present(picker, animated: true, completion: nil)
Créditos a esta fuente .
El error también ocurre cuando no
ha configurado los permisos del uso de la biblioteca de fotos
en su archivo
Info.plist
.
Info.plist
agregar
Privacy - Photo Library Usage Description
en la
Info.plist
con una
cadena
que aparecerá cuando su aplicación intente por primera vez acceder a la biblioteca de fotos del usuario.
En mi caso, recibí este error porque presentaba un controlador de selección de imágenes sin verificar primero si el usuario había permitido el acceso a las imágenes. En otra parte de mi código, el usuario había otorgado permiso, así que creo que todo lo que tenía que hacer era importar fotos. Sin embargo, dado que ''tal vez'' no hayan otorgado permiso en ese momento en la aplicación, agregar esto justo antes de presentar el controlador del selector de imágenes resolvió el problema por mí (importar fotos también).
// request photos permission if permission has not been granted
if PHPhotoLibrary.authorizationStatus() != PHAuthorizationStatus.authorized {
PHPhotoLibrary.requestAuthorization({ (status: PHAuthorizationStatus) in
})
}
Si esta respuesta parece redundante, mis disculpas, pero tuve que juntar algunas respuestas diferentes para que mi solución funcionara. Quizás esto ayude a alguien más a usar Swift 4.
Encontré esta solución. Obtuvimos este error debido a estas dos razones que se mencionan a continuación.
- Primero necesitamos llamar a este método para autorización
Código de Autorización
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
correcta del método Llamada dedidFinishPickingMediaWithInfo
Incorrecto:
private func imagePickerController( picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
}
Correcto
@objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
}
Espero que esta solución te ayude a resolver este error.
Si funciona para usted, no olvide marcarlo como correcto, por lo que esto ayudará a otros a encontrar la forma correcta.
Encontré la solución de 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)
}
Encontrar la solución para este problema me llevó una eternidad. Parece que el problema es que no se puede encontrar la función imagePickerController de UIImagePickerControllerDelegate. Si configuró el delegado correctamente y dejó de funcionar después de actualizar a Swift 4, el problema probablemente sea que no lo hizo accesible para Objective-C utilizando @objc, que es necesario desde Swift 4.
Tiene que ser:
@objc func imagePickerController (...
en vez de
func imagePickerController(...
Este error "Dominio de error = Código PlugInKit = 13" ha confundido a mucha gente a pesar de que parece ser un mensaje inofensivo de depuración de Apple. Estaba teniendo problemas para obtener la imagen que elegí para configurar en mi interfaz de usuario y pensé que ese error era el problema, sin embargo, era algo un poco más sutil.
Tengo mi controlador de selección de imágenes en un archivo separado del controlador de vista que lo presenta.
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)}
)
}
}
La mayoría de los tutoriales y respuestas tienen la finalización establecida en cero. Sin embargo, si configura la finalización en nulo y llama al método didSelect del delegado por separado, se llama al método pero la imagen no se establece, así que asegúrese de usar la finalización de descartar.
Y una vez más, sé que esta respuesta podría no estar directamente relacionada con la pregunta original, pero tengo la sensación de que mucha gente vendrá por este problema y las soluciones dadas no están ayudando. La razón es que la mayoría de las personas que dan respuestas tienen su controlador de selección de imágenes en la misma clase que su controlador de vista principal y, por lo tanto, no necesitan usar una finalización.
Esto es lo que hice y resolvió mi problema.
- agregar @objc
- agregar interno
- agregar _ antes de imagePicker
- asegúrese de utilizar AnyObject y no AnyObject
¡Espero que esto ayude!
Esto me dejó perplejo, pero la respuesta en el siguiente enlace funcionó para mí. El error desapareció y la imagen se muestra como se esperaba
Al igual que una de las respuestas anteriores, debe tener
(_ picker...
pero también
@objc
antes de la función.
@objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
...
}
Esto resolvió mi error:
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)
}
Esto soluciona el problema en Swift 4:
Cambia el código a continuación
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {}
a esto:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {}
Swift 4.2 update:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){}
Intenté algunas de las respuestas combinadas sin mucho éxito.
Al usar Swift 4, descubrí que necesitaba asegurarme de que se implementaran los siguientes dos elementos para garantizar que la imagen se seleccionó y se colocó en el selector (tenga en cuenta que se encontraron los errores "[descubrimiento] al descubrir extensiones:
Error Domain = Código PlugInKit = 13 "consulta cancelada" UserInfo = {NSLocalizedDescription = consulta cancelada} "
el mensaje todavía se muestra en la consola, pero no le impide agregar una imagen). ¿Tal vez este es un mensaje que hace que se descarte el selector?
1) ¿El delegado para
UIImagePickerController
es
(UIImagePickerControllerDelegate & UINavigationControllerDelegate)?
por lo tanto, debe agregar explícitamente
UINavigationControllerDelegate
como uno de los protocolos:
class ViewController:UIViewController, UIImagePickerControllerDelegate,
UINavigationControllerDelegate { .... }.
2) Asegúrese de que info.plist tenga configurada la clave
Privacy - Photo library Usage Description
y el valor de cadena.
Por supuesto, debe asegurarse de crear un
UIImagePickerController
y establecer su delegado igual a
self
en
ViewDidLoad()
:
class ViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
let imagePickerController = UIImagePickerController()
override func viewDidLoad() {
super.viewDidLoad()
imagePickerController.delegate = self
}
...
}
Leí todas estas respuestas y las modifiqué un poco aquí y no necesité descartarlas, esto funcionó para mí, gracias a otros que respondieron aquí.
@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
}
}
Me encontré con el mismo problema. Ninguna de las sugerencias mencionadas me funcionó. Sin embargo, lo resolví, llamando explícitamente a picker.dismiss y despidiendo publicar eso. No tengo claro por qué hice llamadas de desestimación así, pero funcionó para mí.
@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!)
}
}
Por favor, verifique los pasos de la siguiente manera:
- Importar fotos
-
Tiene acceso al álbum:
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) }) } }
-
Presente 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) } }
-
El paso clave, asegúrese de que el método delegado es como seguir estrictamente
// 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) }
Por mi parte,
UINavigationControllerDelegate
delegado
UINavigationControllerDelegate
.
class YourViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate
Puede que esta no sea la respuesta más útil, ¡pero con suerte ayudará! Estoy 99% seguro de que este mensaje de error en particular no te está señalando el problema real. Pasé horas tirando de mi cabello sobre este mismo problema exacto.
1) Tenía autorización para imprimir fotos en la consola cuando iniciaba mi selector, 2) podía navegar y elegir una foto lo suficientemente fácil, y 3) cuando volvía a mi vista al cerrar el selector, la imagen de mi botón no se actualizó con la nueva foto ... y la única pista que tuve sobre el problema fue exactamente el mismo mensaje de error que está recibiendo.
Resulta que estaba codificando una imagen de marcador de posición en ViewWillAppear en lugar de ViewDidLoad. Cada vez que el seleccionador estaba descartando, llamaba a ViewWillAppear y reemplazaba mi imagen elegida con mi imagen codificada. Solucioné ese problema y, efectivamente, todo funciona bien ahora ... y sigo viendo ese mensaje de error cada vez que regreso del selector.
Recomiendo buscar su problema en otro lugar que no sea ImagePicker y es probable que lo encuentre.
Recibí el mismo mensaje cuando estaba tratando de presentar otro controlador desde el selector de devolución de llamada
imagePickerController
.
La solución que funcionó para mí fue mover mi código dentro de la devolución de llamada de finalización desde el método de descarte del selector
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)
}
}
}
Se solucionó configurando 1 segundo de retraso al configurar la imagen.
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
})
}
}
Si no lo ha hecho, intente this .
Producto> Esquema> Editar esquema> Variables de entorno
OS_ACTIVITY_MODE: disable
Resuelve mi problema.
Solucioné este problema, llame a la función a continuación en viewdidload o viewWillAppear o viewDidAppear para verificar el permiso de su aplicación.
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.")
}
}
Y para utilizar el método anterior, no olvide agregar
import Photos
en la parte superior de la clase.
Tengo el mismo error y lo solucioné de esta manera:
obtener un objeto de imagen de manera diferente depende de UIImagePickerController allowEditing es verdadero o falso
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
if isImagePickerAllowEditing {
sourceImage = info[UIImagePickerControllerEditedImage] as? UIImage
} else {
sourceImage = info[UIImagePickerControllerOriginalImage] as? UIImage
}
....
}
Y, por supuesto, solicite primero el permiso para acceder a la biblioteca de fotos como los comentarios anteriores.
Tuve este mismo problema en Swift 4.2 y Xcode 10.0 . Aunque el selector de imágenes funcionaba correctamente, Xcode mostró este error en la consola. Para deshacerse de esto:
- En el menú Xcode Producto> Esquema> Editar esquema
- Seleccione la pestaña ''Ejecutar'', luego ''Argumentos''
- En la sección ''Variables de entorno'' agregue una variable con Nombre OS_ACTIVITY_MODE y Valor deshabilitado
usa este código
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])
@objc
referencia explícita a 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)
}
* Falta DELEGATE *
en Swift 3
En mi caso, todas las configuraciones fueron correctas:
1 - Delegados (UIImagePickerControllerDelegate, UINavigationControllerDelegate);
2 - Permisos ya verificados;
3 - Plist ya hecho;
4 - Todo lo leído en estas Respuestas, lo hice;
Pero olvidé implementar
pickerview.delegate = self
en
viewDidLoad
porque COPIO y PEGO desde mi otro viewController y lo olvido.
¡Espero que ayude a alguien, revise su COPIA / PEGA primero!
XCODE 10.1 / SWIFT 4.2:
-
Agregar permisos requeridos (otros mencionados)
-
Implemente esta función de delegado:
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) }
haga clic en imageView para cargar la imagen de la biblioteca de fotos y mostrar la vista previa en la misma imagen vista. en 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)
}