Lỗi phát hiện PhotoPicker: Tên miền lỗi = Mã PlugInKit = 13


118

Tôi đang cố hiển thị hình ảnh từ thư viện ảnh trong UIImageView

Toàn bộ lỗi là:

2017-06-09 21: 55: 59.063307 + 0200 firstapp2.0 [12873: 1120778] Lỗi phát hiện PhotoPicker: Lỗi Miền = Mã PlugInKit = 13 "truy vấn bị hủy" UserInfo = {NSLocalizedDescription = truy vấn bị hủy}

Mã của tôi được bao gồm bên dưới:

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
Tôi cũng mắc lỗi tương tự. bạn có đang sử dụng Xcode 9 beta, iOS 11 không?
John

4
Điều này đã từng hoạt động ... và sau đó iOS 11 Beta 4 đột ngột cho tôi lỗi này. Thật ki cục.
user2153553

2
Tôi đang gặp lỗi tương tự và quá trình triển khai của tôi là obj-c. Thông báo lỗi này không thể liên quan đến kiểu truyền của từ điển thông tin được trả về trong phương thức ủy quyền UIImagePicker trong mục tiêu-c: - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)infocác giá trị từ điển được chuyển thành id trong obj-c. Tôi cũng đã triển khai yêu cầu ủy quyền và xử lý để truy cập thư viện ảnh của người dùng: vẫn nhận được thông báo lỗi. Tôi đã thêm vào tệp info.plist mục bảo mật cho việc sử dụng thư viện ảnh của người dùng.
valeCocoa

2
Tôi nhận lỗi hiện tại tuy nhiên nó không ngăn cản tôi để có được hình ảnh từ thư viện và sử dụng nó sau này ..
shokuroff

3
Tôi đã thử tất cả các gợi ý trong tất cả các câu trả lời kết hợp, nhưng không có kết quả.
Nicolas Miari

Câu trả lời:


39

Bạn cần tạo tham chiếu Objective-C rõ ràng: @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
Làm việc cho tôi. Gần đây tôi đã cập nhật lên Swift 4 và Xcode 9 và điều này đã giải quyết được nó.
user3144836

3
Làm việc cho tôi. Bắt buộc sau khi chuyển sang Swift 4.0.
mayankk2308

4
Không hoạt động. Lỗi này xảy ra sau khi tôi gọi dismiss.
Kimi Chiu

Lạ thật. Điều này làm việc với tôi tuy nhiên xcode đánh dấu nó là một cảnh báo và mong đợi một chữ ký của: `` Instance method 'imagePickerController ( : didFinishPickingMediaWithInfo :)' gần như khớp với yêu cầu tùy chọn 'imagePickerController ( : didFinishPickingMediaWithInfo :)' of protocol 'UIImagePickerControllerDelegate' Makero 'image (_ : didFinishPickingMediaWithInfo :) 'riêng tư để tắt tiếng cảnh báo này'
Dark Castle

@DarkCastle bạn cần viết hàm vào một extension [your class name]khối, bên ngoài lớp.
Prometheos II

18

Tôi đã tìm thấy giải pháp này. Chúng tôi gặp lỗi này do hai lý do được đề cập bên dưới.

  1. Trước tiên, chúng ta cần gọi phương thức này để ủy quyền

Mã ủy quyề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.")
  }
}
  1. Cách đúng của phương pháp Gọi của didFinishPickingMediaWithInfo

Sai lầm:

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

Đúng

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

Tôi hy vọng giải pháp này sẽ giúp bạn giải quyết lỗi này.

Nếu nó phù hợp với bạn, đừng quên đánh dấu nó là đúng, vì vậy điều này sẽ giúp những người khác tìm ra cách chính xác.


Noob PSA: PHPhotoLibrary là từ mô-đun Ảnh của Swift
Braden Holt

Không hoạt động. Lỗi xảy ra sau khi tôi gọipicker.dismiss(animated: true, completion: nil)
ForceBru

17

Tôi đã tìm thấy nó! Nó đang cố gắng cho bạn biết rằng bạn không có quyền đối với "ảnh". Bạn cần bao gồm #import <Photos/Photos.h>và yêu cầu ủy quyền, ví dụ như thế này trong Objective-C.

Hy vọng điều này sẽ giúp bạn tiết kiệm thời gian. Tôi đã dành trọn hai ngày để gỡ lỗi này!

[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;
    }
}];

Tôi chắc chắn ai đó có thể cho bạn biết cách làm điều tương tự trong Swift.


1
hãy chắc chắn bao gồm #import <Photos / Photos.h>
Robert Wohnoutka 23/09/17

6
Điều này không khắc phục được sự cố của tôi.
fi12

1
Tôi nhận được thông báo bên dưới trong bảng điều khiển "Đang đọc từ cài đặt người dùng hiệu quả riêng tư. Lỗi gặp phải khi khám phá tiện ích mở rộng: Lỗi Miền = Mã PlugInKit = 13" đã hủy truy vấn "UserInfo = {NSLocalizedDescription = truy vấn đã hủy}". Nó không giải quyết được vấn đề.
Biranchi

15

Đã thử một vài phản hồi kết hợp mà không thành công nhiều.

Khi sử dụng Swift 4, tôi nhận thấy rằng mình cần đảm bảo triển khai hai mục sau để đảm bảo rằng hình ảnh được chọn và đặt vào bộ chọn (lưu ý rằng đã gặp phải lỗi "[explore] khi khám phá các tiện ích mở rộng:

Tên miền lỗi = Mã PlugInKit = 13 "truy vấn bị hủy" UserInfo = {NSLocalizedDescription = truy vấn bị hủy} "

thông báo vẫn hiển thị trong bảng điều khiển, nhưng nó không ngăn bạn thêm hình ảnh). Có thể đây là một thông báo dẫn đến việc bộ chọn bị loại bỏ?

1) Các đại biểu cho UIImagePickerController(UIImagePickerControllerDelegate & UINavigationControllerDelegate)?rất cần thiết phải thêm một cách rõ ràng UINavigationControllerDelegatelà một trong những giao thức:

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

2) Đảm bảo rằng info.plist có Privacy - Photo library Usage Descriptionkhóa và giá trị Chuỗi được đặt.

Tất nhiên, bạn cần đảm bảo rằng bạn tạo UIImagePickerControllervà đặt ủy quyền của nó bằng selftrong ViewDidLoad():

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

4
tôi có tất cả điều này trong dự án của tôi .. nó vẫn doesnt làm việc
Mohamed Lee

Cảm ơn tôi đã bỏ lỡ thiết lập đại biểu trong viewDidLoad ()
Arshad Shaik

11

Tôi đã khắc phục sự cố này, hãy gọi hàm bên dưới vào viewdidload hoặc viewWillAppear hoặc viewDidAppear để kiểm tra quyền cho ứng dụng của bạ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.")
        }
    }

Và để sử dụng phương pháp trên, đừng quên thêm import Photosvào đầu lớp.


11

XCODE 10.1 / SWIFT 4.2:

  1. Thêm các quyền cần thiết (những quyền khác được đề cập)

  2. Triển khai func đại biểu này:

    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
Cách thật của việc sử dụng imagePickerController func trên Swift 4x
Samet Sazak

10

* Thiếu DELEGATE * trong Swift 3

Trong trường hợp của tôi, tất cả các cài đặt đều đúng:
1 - Delegates (UIImagePickerControllerDelegate, UINavigationControllerDelegate);
2 - Quyền đã được xác minh;
3 - Danh sách đã được thực hiện;
4 - Mọi thứ đọc trên Câu trả lời này, tôi đã làm;

Nhưng tôi đã quên triển khai pickerview.delegate = selftrên viewDidLoad Bởi vì tôi SAO CHÉP và TẠM DỪNG từ viewController khác của tôi và quên điều đó!

Tôi hy vọng nó sẽ giúp ích cho ai đó, hãy xem lại BẢN SAO / QUÁ KHỨ của bạn trước !!!


Cảm ơn, đang phải vật lộn trong nhiều giờ dài và tôi đã bỏ lỡ "UINavigationControllerDelegate", bạn đã lưu cuối cùng, nhờ
Sakthimuthiah

Rất vui được giúp đỡ :)
Daniel Arantes Loverde

8

Đây có thể không phải là câu trả lời hữu ích trực tiếp nhất - nhưng hy vọng nó sẽ hữu ích! Tôi chắc chắn 99% rằng thông báo lỗi cụ thể này không thực sự chỉ bạn đến vấn đề thực sự. Tôi đã dành hàng giờ để nhổ tóc vì vấn đề chính xác này.

1) Tôi đã được phép in ảnh vào bảng điều khiển khi tôi khởi chạy bộ chọn của mình, 2) Tôi có thể điều hướng và chọn ảnh đủ dễ dàng và 3) khi tôi đưa tôi trở lại chế độ xem sau khi loại bỏ bộ chọn, hình ảnh nút không được cập nhật với ảnh mới ... và gợi ý duy nhất mà tôi gặp phải vấn đề là chính xác thông báo lỗi mà bạn đang nhận được.

Hóa ra tôi đã cố mã hóa một hình ảnh giữ chỗ trong ViewWillAppear thay vì ViewDidLoad. Mỗi khi bộ chọn loại bỏ, nó sẽ gọi ViewWillAppear và thay thế hình ảnh đã chọn của tôi bằng hình ảnh được mã hóa cứng của tôi. Tôi đã khắc phục sự cố đó và đủ chắc chắn - mọi thứ hiện đang hoạt động tốt ... và tôi vẫn thấy thông báo lỗi đó mỗi khi tôi trở lại từ bộ chọn.

Tôi khuyên bạn nên tìm kiếm một nơi nào đó khác ngoài ImagePicker cho vấn đề của bạn và bạn có thể sẽ tìm thấy nó.


7

Nếu bạn chưa làm như vậy, hãy thử điều này .

Sản phẩm> Lược đồ> Chỉnh sửa Lược đồ> Biến Môi trường OS_ACTIVITY_MODE: disable

Nó giải quyết vấn đề của tôi.


23
Điều này ngăn chặn các thông báo lỗi nhưng không giải quyết được nguyên nhân của chúng. Nó cũng ngăn chặn các thông báo hệ thống khác và bất cứ thứ gì từ đó NSLog.
John Montgomery,

6
Điều này không 'giải quyết' vấn đề, chỉ làm cho nó vô hình. Thực hành rất tệ.
zeeshan

Điều này tương đương với việc che giấu bụi bẩn của bạn dưới tấm thảm tbh
shiv

7

Điều này khắc phục sự cố trong Swift 4:

Thay đổi mã bên dưới

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {}

đến điều này:

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


Swift 4.2 update:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]){}

Lỗi của tôi trông giống như sau: lỗi gặp phải khi khám phá các tiện ích mở rộng: Lỗi Miền = Mã PlugInKit = 13 "truy vấn bị hủy" UserInfo = {NSLocalizedDescription = truy vấn bị hủy} Và điều này đã giải quyết được vấn đề của tôi, mặc dù tôi không thể nói liệu điều này có giúp được OP . Cảm ơn :)
agrippa

6

Tôi nhận được thông báo tương tự khi tôi đang cố gắng trình bày một bộ điều khiển khác từ cuộc gọi lại của bộ chọn imagePickerController. Giải pháp phù hợp với tôi là di chuyển mã của tôi bên trong lệnh gọi lại hoàn thành từ phương thức loại bỏ bộ chọn

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

Câu trả lời tuyệt vời, bạn đã tiết kiệm thời gian của tôi 👍🏼
Coder ACJHP

Làm việc tuyệt vời! Hãy nghĩ rằng đây là cách chính xác để giải quyết các lỗi bộ chọn trong Swift 4.x.
shiv

4

Hãy chắc chắn rằng bạn đang subclassing cả: UIImagePickerControllerDelegate, UINavigationControllerDelegate.

Ngoài ra, hãy nhớ đặt đại biểu:

let picker = UIImagePickerController()
picker.allowsEditing = true
picker.sourceType = .photoLibrary
picker.delegate = self  //Don't forget this line!
self.present(picker, animated: true, completion: nil)

Tín dụng cho nguồn này .


picker.delegate = self - là trường hợp của tôi! Cảm ơn bạn.
Alexey Chekanov

4

Tôi đã tìm cách khắc phục sự cố này mãi mãi. Có vẻ như vấn đề là không tìm thấy hàm imagePickerController của UIImagePickerControllerDelegate. Nếu bạn đã đặt ủy quyền chính xác và nó ngừng hoạt động sau khi nâng cấp lên Swift 4, thì vấn đề có thể là bạn không thể truy cập Objective-C bằng cách sử dụng @objc được yêu cầu kể từ Swift 4.

Nó phải là:

@objc func imagePickerController (...

thay vì

func imagePickerController(...

Nó tạo ra lỗiObjective-C method 'imagePickerController:didFinishPickingMediaWithInfo:' provided by method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' conflicts with optional requirement method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' in protocol 'UIImagePickerControllerDelegate'
Nico Neill

Chính xác, đây là cách để sửa chữa nó!
Maria Ortega,

@NicoNeill bạn đã thêm hàm vào một extensionkhối chưa?
Prometheos II

4

Đã sửa lỗi bằng cách đặt độ trễ 1 giây khi cài đặt hình ảnh.

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

Đảm bảo thêm internal funcvào đầu và sau đó thêm chữ thường sau dấu ngoặc đơn ( _ picker: UIImagePickerController…và sau đó thay đổi từ AnyObjectthành Any]…
Kiểm tra mã bên dưới:

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

Điều này đã làm tôi bối rối, nhưng câu trả lời ở liên kết bên dưới phù hợp với tôi. Lỗi đã biến mất và hình ảnh hiển thị như mong đợi

Giống như một trong những câu trả lời ở trên, bạn phải có (_ picker...nhưng cũng phải có @objctrước hàm.

@objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
...
}

https://forums.developer.apple.com/thread/82105


2

Điều này đã giải quyết được lỗi của tôi:

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

Vui lòng kiểm tra theo các bước như sau:

  1. Nhập ảnh
  2. Có quyền truy cập vào album:

    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. Trình bày 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. Bước quan trọng, hãy đảm bảo rằng phương pháp ủy quyền giống như sau một cách nghiêm ngặt

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

Đây là những gì tôi đã làm và nó giải quyết được vấn đề của tôi.

  • thêm @objc
  • thêm nội bộ
  • thêm _ trước imagePicker
  • đảm bảo rằng bạn đang sử dụng Any và không phải AnyObject

Hi vọng điêu nay co ich!


Hmm, internallà mặc định; Tôi tự hỏi những gì khác biệt nó làm để xác định nó ...
Nicolas Miari

2

Trong trường hợp của tôi, tôi gặp lỗi này vì tôi đang trình bày một bộ điều khiển bộ chọn hình ảnh mà không xác minh trước xem người dùng có cho phép truy cập vào hình ảnh hay không. Ở những nơi khác trong mã của tôi, người dùng đã cấp quyền nên tôi nghĩ tất cả những gì tôi cần làm là nhập Ảnh. Tuy nhiên, vì họ 'có thể' không cấp quyền vào thời điểm đó trong ứng dụng, thêm điều này ngay trước khi tôi trình bày bộ điều khiển bộ chọn hình ảnh đã giải quyết được vấn đề cho tôi (nhập cả Ảnh).

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

        })
    }

Nếu câu trả lời này có vẻ thừa thì tôi xin lỗi nhưng tôi đã phải ghép từ một vài câu trả lời khác nhau để giải pháp của tôi có hiệu quả. Có lẽ điều này sẽ giúp ích cho những người khác đang sử dụng Swift 4.


2

sử dụng mã này

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any])

2

Lỗi "Error Domain = PlugInKit Code = 13" này đã khiến rất nhiều người bối rối mặc dù nó có vẻ là một thông báo gỡ lỗi táo vô hại. Tôi đã gặp sự cố khi lấy hình ảnh mà tôi đã chọn để đặt trong giao diện người dùng của mình và nghĩ rằng lỗi đó là vấn đề, tuy nhiên đó là một cái gì đó tinh vi hơn một chút.

Tôi có bộ điều khiển bộ chọn hình ảnh của mình trong một tệp tách biệt với bộ điều khiển chế độ xem đang trình bày nó.

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

Hầu hết các hướng dẫn và câu trả lời có phần hoàn thành được đặt thành con số không. Tuy nhiên, nếu bạn đặt hoàn thành thành nil và gọi riêng phương thức didSelect của đại biểu, phương thức được gọi nhưng hình ảnh không được đặt, vì vậy hãy đảm bảo sử dụng hoàn thành loại bỏ '.

Và một lần nữa, tôi biết câu trả lời này có thể không liên quan trực tiếp đến câu hỏi ban đầu nhưng tôi có cảm giác rằng rất nhiều người đang đến đây vì vấn đề này và các giải pháp đã đưa ra không hữu ích. Lý do là hầu hết những người đưa ra câu trả lời có bộ điều khiển bộ chọn hình ảnh của họ cùng lớp với bộ điều khiển chế độ xem chính của họ và do đó không cần sử dụng hoàn thành.


Đây chính xác là những gì tôi cần. Cảm ơn bạn!
AJ Hernandez

1

Lỗi cũng xảy ra khi bạn chưa định cấu hình quyền sử dụng Thư viện ảnh trong Info.plisttệp của mình.

Bạn cần thêm Privacy - Photo Library Usage Descriptionvào Info.plistvới một Chuỗi sẽ xuất hiện khi Ứng dụng của bạn cố gắng truy cập vào Thư viện ảnh của Người dùng lần đầu tiên.

Các Info.plistđiều chỉnh cuối cùng sẽ trông giống như sau: nhập mô tả hình ảnh ở đây


1

Tôi gặp lỗi tương tự và tôi đã sửa nó theo cách này:

lấy đối tượng hình ảnh theo cách khác nhau tùy thuộc vào UIImagePickerController cho phép Chỉnh sửa là đúng hay sai

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

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

    ....

}

Và tất nhiên, hãy xin quyền truy cập thư viện ảnh trước như bình luận trên.


1

Về cuối UINavigationControllerDelegateđại biểu của tôi bị thiếu.

class YourViewController:UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate


0

Tôi đã gặp cùng một vấn đề. Không có gợi ý nào được đề cập ở trên phù hợp với tôi. Tuy nhiên, tôi đã giải quyết nó, bằng cách gọi explicilty là picker.dismiss và loại bỏ bài đăng đó. Tôi không rõ tại sao tôi lại thực hiện các cuộc gọi đuổi việc như vậy, nhưng nó đã hiệu quả với tôi.

   @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

Tôi đã đọc tất cả các câu trả lời này và sửa đổi một chút ở đây và không cần phải loại bỏ, điều này đã hiệu quả với tôi, Cảm ơn những người khác đã trả lời ở đây.

    @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

tôi đã tìm thấy giải pháp của 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

nhấp vào imageView để tải hình ảnh từ thư viện ảnh và hiển thị bản xem trước trên cùng một imageview. nhanh chóng 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)
            }

0

Cũng gặp sự cố này trên Swift 4.2Xcode 10.0 . Mặc dù bộ chọn hình ảnh hoạt động bình thường nhưng Xcode đã hiển thị lỗi này trên bảng điều khiển. Để loại bỏ điều này:

  • Trên menu Xcode Sản phẩm> Lược đồ> Chỉnh sửa Lược đồ
  • Chọn tab 'Chạy', sau đó chọn 'Đối số'
  • Mở phần 'Environment Variables' thêm một biến với Tên OS_ACTIVITY_MODE và giá trị vô hiệu hóa

Vâng ... không thực sự ... đối với tôi nó cho thấy lỗi này nhưng phương pháp didFinishPickingMediaWithInfo không được gọi là ... vì vậy tôi cần thiết để cho phép giá trị này để thấy lỗi này
Mohamed Lee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.