imagePickerController - didFinishPickingMediaWithInfo не вызывается после выбора медиа - PullRequest
0 голосов
/ 17 апреля 2019

преобразованное приложение из swift 3 в swift 4.2.В моем приложении была добавлена ​​функция загрузки изображения вашего профиля, и я пытаюсь выяснить, почему.Пока что я вижу, что

func imagePickerController (_ picker: UIImagePickerController, didFinishPickingMediaWithInfo

didFinishPickingMediaWithInfo не вызывается после того, как носитель был выбран

Вот мой

import UIKit

class CameraMenuViewController: BaseViewController,  UIImagePickerControllerDelegate, UINavigationControllerDelegate {


var UserID:Int = 0


@IBOutlet weak var myImageView: UIImageView!
var callback : ((UIImage) -> ())?

@IBOutlet weak var btn_end: UIButton!
@IBOutlet weak var from_camera: UIBarButtonItem!
@IBOutlet weak var from_gallery: UIBarButtonItem!

@IBAction func btn_end_pressed(_ sender: UIButton) {
    //


    //self.openViewControllerBasedOnIdentifier("Home")

    //let data = UIImagePNGRepresentation(myImageView) as NSData?
    let image = myImageView.image!.pngData() as NSData?

    //if let data = UIImagePNGRepresentation(myImageView) {

        print("callback data")


        let userDetails:Dictionary = (UserDefaults.standard.value(forKey: "myUserDetails") as? [String:Any])!
        let UserID:Int = userDetails["UserID"] as! Int
        print("UserID")
        print(UserID)



        print("is_selfie from callback")


        //save profile image as NewUserID
        UserDefaults.standard.set(image, forKey: String(UserID))
        UserDefaults.standard.synchronize()

        self.view.removeFromSuperview()

    //}



}

@IBAction func btn_closer(_ sender: UIButton) {
    //self.view.removeFromSuperview()
}


@IBAction func photofromLibrary(_ sender: UIBarButtonItem) {
    picker.allowsEditing = false
    picker.sourceType = .photoLibrary
    picker.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
    picker.modalPresentationStyle = .popover
    present(picker, animated: true, completion: nil)
    picker.popoverPresentationController?.barButtonItem = sender
}



@IBAction func shootPhoto(_ sender: UIBarButtonItem) {
    if UIImagePickerController.isSourceTypeAvailable(.camera) {

        print("photo shoot")

        //UserDefaults.standard.set("selfie", forKey: "is_selfie")
        UserDefaults.standard.set(true, forKey: "is_selfie")
        UserDefaults.standard.synchronize()

        DispatchQueue.main.async {
            self.picker.allowsEditing = false
            self.picker.sourceType = UIImagePickerController.SourceType.camera
            self.picker.cameraCaptureMode = .photo
            self.picker.modalPresentationStyle = .fullScreen
            self.present(self.picker,animated: true,completion: nil)
        }

    } else {
        noCamera()
    }



}


let picker = UIImagePickerController()





override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


    picker.delegate = self


    DispatchQueue.global(qos: .userInitiated).async
        {
            self.present(self.picker, animated: true, completion: nil)

        }

    let language = UserDefaults.standard.object(forKey: "myLanguage") as! String

    if(language=="arabic"){
        //from_camera.setTitle("كاميرا",for: .normal)
        //from_gallery.text.setTitle("الصور",for: .normal)
        btn_end.setTitle("إنهاء",for: .normal)
    }





}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}





//MARK: - Delegates
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
{



    let chosenImage = info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey.originalImage)] as! UIImage //2
    myImageView.contentMode = .scaleAspectFit //3
    myImageView.image = chosenImage //4


    myImageView.layer.borderWidth = 1
    myImageView.layer.masksToBounds = false
    myImageView.layer.borderColor = UIColor.black.cgColor
    myImageView.layer.cornerRadius = myImageView.frame.height/4
    myImageView.clipsToBounds = true

    callback?(chosenImage)




    dismiss(animated:true, completion: nil)

}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    dismiss(animated: true, completion: nil)
}

func noCamera(){
    let alertVC = UIAlertController(
        title: "No Camera",
        message: "Sorry, this device has no camera",
        preferredStyle: .alert)
    let okAction = UIAlertAction(
        title: "OK",
        style:.default,
        handler: nil)
    alertVC.addAction(okAction)
    present(
        alertVC,
        animated: true,
        completion: nil)
}





}

// Helper function inserted by Swift 4.2 migrator.
fileprivate func convertFromUIImagePickerControllerInfoKey(_ input:  UIImagePickerController.InfoKey) -> String {
return input.rawValue
}

Пожалуйста, помогите мне понять, почему FininPickingMediaWithInfo больше не вызывается

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

Похоже, что объявление функции изменилось между Swift 3 и 4.2. Это не должно быть обновлено для вас с помощью Swift Migrator Tool. Когда я это делаю, я проверяю правильность объявления функции, используя синтаксис многострочных комментариев, чтобы закомментировать вашу текущую функцию (didFinishPickingMediaWithInfo в вашем случае). Затем вы можете начать вводить функцию снова и использовать автозаполнение XCode, чтобы убедиться, что она верна. Затем вы можете скопировать содержимое закомментированной вами функции в это новое и правильное объявление функции.

Или - вы можете просто посмотреть документацию! Согласно документации на imagePickerController , функция должна быть объявлена ​​как:

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

Если вы замените объявление функции на приведенное выше, оно должно быть вызвано снова.

1 голос
/ 17 апреля 2019

Как сказал Крэйг, вам нужно изменить объявление функции делегата, а также впоследствии вам нужно обновить следующее:

let chosenImage = info[UIImagePickerController.InfoKey.originalImage] as! UIImage

Эти два изменения вместе должны решить вашу проблему.

...