ข้อผิดพลาดในการค้นพบ PhotoPicker: Error Domain = PlugInKit Code = 13


118

ฉันพยายามแสดงภาพจากคลังรูปภาพใน 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)
    }
}

11
ฉันได้รับข้อผิดพลาดเดียวกัน คุณใช้ Xcode 9 beta, 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

2
ฉันได้รับข้อผิดพลาดในปัจจุบัน แต่มันไม่ได้ป้องกันไม่ให้ฉันได้รับภาพจากห้องสมุดและใช้ในภายหลัง ..
shokuroff

3
ฉันพยายามทั้งหมดของข้อเสนอแนะในทุกคำตอบรวมกันจะไม่มีประโยชน์
Nicolas Miari

คำตอบ:


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

3
ใช้ได้ผลสำหรับฉัน จำเป็นหลังจากย้ายไปใช้ Swift 4.0
mayankk2308

4
ไม่ทำงาน ข้อผิดพลาดนี้เกิดขึ้นหลังจากที่ฉันโทรdismissไป
Kimi Chiu

แปลก. สิ่งนี้ใช้ได้ผลสำหรับฉันอย่างไรก็ตาม xcode ทำเครื่องหมายว่าเป็นคำเตือนและคาดว่าจะมีลายเซ็นของ: `` วิธีการอินสแตนซ์ 'imagePickerController ( : didFinishPickingMediaWithInfo :)' เกือบจะตรงกับข้อกำหนดทางเลือก 'imagePickerController ( : didFinishPickingMediaWithInfo :)' ของโปรโตคอล 'UIImagePickerControllerDelegate' สร้าง 'imagePickerController (_ : 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]) {
} 

ฉันหวังว่าโซลูชันนี้จะช่วยคุณในการแก้ไขข้อผิดพลาดนี้

หากได้ผลอย่าลืมทำเครื่องหมายว่าถูกต้องเพื่อช่วยให้ผู้อื่นหาวิธีที่ถูกต้องได้


Noob PSA: PHPhotoLibrary มาจากโมดูล Photos ของ Swift
Braden Holt

ไม่ทำงาน ข้อผิดพลาดเกิดขึ้นหลังจากที่ฉันโทร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 ได้


1
อย่าลืมใส่ #import <Photos / Photos.h>
Robert Wohnoutka

6
สิ่งนี้ไม่สามารถแก้ไขปัญหาของฉันได้
fi12

1
ฉันได้รับข้อความด้านล่างในคอนโซล "กำลังอ่านจากการตั้งค่าผู้ใช้ที่มีประสิทธิผลส่วนตัวพบข้อผิดพลาดขณะค้นพบส่วนขยาย: Error Domain = PlugInKit Code = 13" query Cancel "UserInfo = {NSLocalizedDescription = query disabled}" มันไม่ได้ช่วยแก้ปัญหา
Biranchi

15

ลองใช้คำตอบแบบผสมสองสามรายการ แต่ไม่ประสบความสำเร็จมากนัก

เมื่อใช้ Swift 4 ฉันพบว่าฉันต้องตรวจสอบให้แน่ใจว่าได้ใช้สองรายการต่อไปนี้เพื่อให้แน่ใจว่าได้เลือกและวางรูปภาพลงในเครื่องมือเลือก (โปรดทราบว่าพบข้อผิดพลาด "[การค้นพบ] ขณะค้นพบส่วนขยาย:

โดเมนข้อผิดพลาด = รหัส PlugInKit = 13 "การค้นหาถูกยกเลิก" UserInfo = {NSLocalizedDescription = การค้นหายกเลิก} "

ข้อความยังคงปรากฏในคอนโซล แต่ไม่ได้ป้องกันไม่ให้คุณเพิ่มรูปภาพ) นี่อาจเป็นข้อความที่ส่งผลให้ตัวเลือกถูกปิด?

1) ผู้รับมอบสิทธิ์สำหรับสิ่งUIImagePickerControllerนี้(UIImagePickerControllerDelegate & UINavigationControllerDelegate)?จำเป็นต้องเพิ่มอย่างชัดเจนUINavigationControllerDelegateเป็นหนึ่งในโปรโตคอล:

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

2) ตรวจสอบให้แน่ใจว่า info.plist มีชุดPrivacy - Photo library Usage Descriptionคีย์และค่าสตริง

แน่นอนคุณต้องแน่ใจว่าคุณสร้างUIImagePickerControllerและตั้งค่าผู้รับมอบสิทธิ์เท่ากับselfในViewDidLoad():

class ViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 
    let imagePickerController = UIImagePickerController()
    override func viewDidLoad() {
        super.viewDidLoad()
        imagePickerController.delegate = self
    }
    ...
}

4
ฉันมีทั้งหมดนี้ในโครงการของฉัน .. ก็ยังไม่ได้ผล
Mohamed Lee

ขอบคุณฉันพลาดการตั้งค่า delegate ใน viewDidLoad ()
Arshad Shaik

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ที่ด้านบนสุดของชั้นเรียน


11

XCODE 10.1 / SWIFT 4.2:

  1. เพิ่มสิทธิ์ที่จำเป็น (อื่น ๆ ที่กล่าวถึง)

  2. ใช้ func ที่ได้รับมอบหมายนี้:

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

1
วิธีการใช้งาน imagePickerController func อย่างแท้จริงบน Swift 4x
Samet Sazak

10

* ไม่มี DELEGATE *ใน Swift 3

ในกรณีของฉันการตั้งค่าทั้งหมดถูกต้อง:
1 - Delegates (UIImagePickerControllerDelegate, UINavigationControllerDelegate);
2 - ยืนยันสิทธิ์แล้ว
3 - Plist ทำไปแล้ว;
4 - ทุกสิ่งที่อ่านในคำตอบนี้ฉันทำ;

แต่ฉันลืมที่จะใช้pickerview.delegate = selfในการviewDidLoad เพราะผมคัดลอกและวางจาก viewController อื่น ๆ ของฉันและลืมว่า!

ฉันหวังว่ามันจะช่วยใครสักคนตรวจสอบ COPY / PASTE ของคุณก่อน !!!


ขอบคุณฉันดิ้นรนเป็นเวลานานและฉันพลาด "UINavigationControllerDelegate" ในที่สุดคุณก็ช่วยชีวิตได้แล้วขอบคุณ
Sakthimuthiah

ดีใจที่ได้ช่วยเหลือ :)
Daniel Arantes Loverde

8

นี่อาจไม่ใช่คำตอบที่เป็นประโยชน์โดยตรง แต่หวังว่ามันจะช่วยได้! ฉันแน่ใจ 99% ว่าข้อความแสดงข้อผิดพลาดนี้ไม่ได้ชี้ให้คุณเห็นปัญหาที่แท้จริง ฉันใช้เวลาหลายชั่วโมงในการดึงผมออกจากปัญหาเดียวกันนี้

1) ฉันได้รับอนุญาตให้พิมพ์ภาพถ่ายไปยังคอนโซลเมื่อฉันเปิดตัวเลือก 2) ฉันสามารถนำทางและเลือกภาพถ่ายได้ง่ายพอและ 3) เมื่อฉันจะกลับไปที่มุมมองของฉันเมื่อปิดตัวเลือกรูปภาพปุ่มของฉัน ไม่ได้อัปเดตด้วยรูปภาพใหม่ ... และคำใบ้เดียวที่ฉันพบปัญหาคือข้อความแสดงข้อผิดพลาดเดียวกันกับที่คุณได้รับ

ปรากฎว่าฉันเข้ารหัสภาพตัวแทนใน ViewWillAppear แทน ViewDidLoad ทุกครั้งที่ตัวเลือกกำลังปิดมันจะเรียก ViewWillAppear และแทนที่ภาพที่ฉันเลือกด้วยภาพฮาร์ดโค้ดของฉัน ฉันแก้ไขปัญหานั้นแล้วและแน่นอนว่าตอนนี้ทุกอย่างทำงานได้ดี ... และฉันยังคงเห็นข้อความแสดงข้อผิดพลาดนั้นทุกครั้งที่ฉันกลับจากเครื่องมือเลือก

ฉันขอแนะนำให้มองหาที่อื่นที่ไม่ใช่ ImagePicker สำหรับปัญหาของคุณและคุณน่าจะพบ


7

หากคุณไม่ได้ทำเพื่อลองนี้

ผลิตภัณฑ์> โครงการ> แก้ไขโครงร่าง> ตัวแปรสภาพแวดล้อม OS_ACTIVITY_MODE: disable

มันช่วยแก้ปัญหาของฉันได้


23
วิธีนี้จะระงับข้อความแสดงข้อผิดพลาด แต่ไม่ได้ระบุสาเหตุ นอกจากนี้ยังยับยั้งข้อความของระบบอื่น ๆ NSLogและอะไรจาก
John Montgomery

6
สิ่งนี้ไม่ได้ 'แก้ปัญหา' แต่ทำให้มองไม่เห็น ปฏิบัติแย่มาก.
zeeshan

นี่เท่ากับการซ่อนสิ่งสกปรกของคุณไว้ใต้พรม 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]){}

ข้อผิดพลาดของฉันมีลักษณะดังนี้: พบข้อผิดพลาดขณะค้นพบส่วนขยาย: Error Domain = PlugInKit Code = 13 "query Cancel" UserInfo = {NSLocalizedDescription = query Cancel} และสิ่งนี้ช่วยแก้ปัญหาของฉันได้แม้ว่าฉันจะพูดไม่ได้หากสิ่งนี้ช่วย OP . ขอบคุณ :)
agrippa

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

ตรวจสอบให้แน่ใจว่าคุณกำลัง subclassing ทั้งสอง: 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 - เป็นกรณีของฉัน! ขอบคุณ.
Alexey Chekanov

4

การค้นหาวิธีแก้ไขปัญหานี้ทำให้ฉันต้องใช้เวลาตลอดไป ดูเหมือนว่าปัญหาคือไม่พบฟังก์ชัน imagePickerController ของ UIImagePickerControllerDelegate หากคุณตั้งค่าผู้รับมอบสิทธิ์อย่างถูกต้องและหยุดทำงานหลังจากอัปเกรดเป็น Swift 4 ปัญหาอาจเกิดจากคุณไม่สามารถเข้าถึง Objective-C ได้โดยใช้ @objc ซึ่งจำเป็นต้องใช้ตั้งแต่ Swift 4

จะต้องเป็น:

@objc func imagePickerController (...

แทน

func imagePickerController(...

มันสร้างข้อผิดพลาดObjective-C method 'imagePickerController:didFinishPickingMediaWithInfo:' provided by method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' conflicts with optional requirement method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' in protocol 'UIImagePickerControllerDelegate'
Nico Neill

แน่นอนนี่คือวิธีแก้ไข!
Maria Ortega

@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


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)

}

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

2

นี่คือสิ่งที่ฉันทำและมันช่วยแก้ปัญหาของฉันได้

  • เพิ่ม @objc
  • เพิ่มภายใน
  • เพิ่ม _ ก่อน imagePicker
  • ตรวจสอบให้แน่ใจว่าคุณใช้ Any และไม่ใช่ AnyObject

หวังว่านี่จะช่วยได้!


อืมinternalเป็นค่าเริ่มต้น ฉันสงสัยว่ามันทำให้แตกต่างกันอย่างไร ...
Nicolas Miari

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

2

ข้อผิดพลาด "Error Domain = PlugInKit Code = 13" นี้ทำให้ผู้คนจำนวนมากสับสนแม้ว่าดูเหมือนว่าจะเป็นข้อความดีบักของ Apple ที่ไม่เป็นอันตรายก็ตาม ฉันมีปัญหาในการรับภาพที่ฉันเลือกเพื่อตั้งค่าใน UI ของฉันและคิดว่าข้อผิดพลาดนั้นเป็นปัญหา แต่มันก็ค่อนข้างละเอียดกว่าเล็กน้อย

ฉันมีตัวควบคุมตัวเลือกรูปภาพของฉันในไฟล์ที่แยกจากตัวควบคุมมุมมองที่นำเสนอ

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

บทแนะนำและคำตอบส่วนใหญ่มีการตั้งค่าความสมบูรณ์เป็นศูนย์ อย่างไรก็ตามหากคุณตั้งค่าความสมบูรณ์เป็นศูนย์และเรียกใช้เมธอด didSelect ของผู้รับมอบสิทธิ์แยกกันเมธอดนั้นจะถูกเรียก แต่ไม่ได้ตั้งค่าอิมเมจดังนั้นอย่าลืมใช้การปิดการเสร็จสิ้น

และอีกครั้งฉันรู้ว่าคำตอบนี้อาจไม่เกี่ยวข้องโดยตรงกับคำถามเดิม แต่ฉันรู้สึกว่ามีคนจำนวนมากมาที่นี่สำหรับปัญหานี้และวิธีแก้ปัญหาที่ระบุก็ไม่ได้ช่วยอะไร เหตุผลก็คือคนส่วนใหญ่ที่ให้คำตอบมีตัวควบคุมเครื่องมือเลือกภาพในคลาสเดียวกับตัวควบคุมมุมมองหลักดังนั้นจึงไม่จำเป็นต้องใช้การกรอกข้อมูล


นี่คือสิ่งที่ฉันต้องการ ขอบคุณ!
AJ Hernandez

1

ข้อผิดพลาดยังเกิดขึ้นเมื่อคุณไม่ได้กำหนดค่าการอนุญาตการใช้งานไลบรารีรูปภาพในInfo.plistไฟล์ของคุณ

คุณต้องเพิ่มPrivacy - Photo Library Usage DescriptionในInfo.plistด้วยเชือกที่จะปรากฏขึ้นเมื่อแอปของคุณพยายามเป็นครั้งแรกในการเข้าถึงห้องสมุดรูปภาพของผู้ใช้

การ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
    }

    ....

}

และแน่นอนขออนุญาตเข้าคลังรูปภาพก่อนตามความเห็นข้างบน


1

ในตอนท้ายUINavigationControllerDelegateผู้รับมอบสิทธิ์ของฉันหายไป

class YourViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate


1

ในกรณีของฉันเนื่องจากการจัดการหน่วยความจำการจัดสรรที่รวดเร็วดูเหมือนว่าจะได้รับการปรับให้เหมาะสมและแก้ไขโดย Apple Team รหัสของฉันทำงานได้อย่างสมบูรณ์จนถึงการอัปเดตอย่างรวดเร็วและฉันพบว่า "ข้อผิดพลาด" ของฉันคือฉันไม่ได้รักษาเครื่องมือเลือกไว้ แต่มันใช้งานได้มานานหลายปีโดยไม่มีการเก็บรักษาดังนั้นที่นี่จึงเป็นโซลูชันที่พร้อมสำหรับการทำงาน

// 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
    }
}

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!)
    }

}

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

คลิกที่ imageView เพื่อโหลดภาพจากไลบรารีรูปภาพและแสดงตัวอย่างบน imageview เดียวกัน อย่างรวดเร็ว 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)
            }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.