【问题标题】:Why doesn't UIImagePickerController delegate to my Object class?为什么 UIImagePickerController 不委托给我的 Object 类?
【发布时间】:2016-12-17 06:10:44
【问题描述】:
class CameraPicker: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
weak var viewController:MyProfileVC!

 func launchCamera() {
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera) {
            let imagePicker:UIImagePickerController = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = UIImagePickerControllerSourceType.camera
            imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.front
            imagePicker.cameraCaptureMode = .photo
            imagePicker.allowsEditing = false

            self.viewController.present(imagePicker, animated: true, completion: nil)
        } }
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
        print("didFinishPickingMedia")
}

这是我的对象类函数,但拍照后没有调用“didFinishPickingMediaWithInfo”函数。此外,呈现图像选择器的视图控制器是不同的 Swift 文件

【问题讨论】:

  • 你是在模拟器还是手机上试试这个?,模拟器上不行,因为模拟器没有摄像头
  • 我正在手机上试试这个
  • @Dee 你在 info.plist 中添加了NSPhotoLibraryUsageDescription 吗?
  • 是的,我有 Nirav D,感谢您提醒我。我现在已经解决了这个问题,感谢您的帮助,对于迟到的回复,我深表歉意。

标签: ios swift uiimagepickercontroller


【解决方案1】:

我遇到了同样的问题,我找到了解决方案,所以我发布了我的版本(我正在从照片库中拍照,但它是相同的 :))。

我遇到了内存管理问题。 我创建了一个 IBAction 函数,在其中实例化了我的相机处理程序类(其中包含委托......)。在函数结束时,变量超出范围并被释放。为了解决这个问题,我将它作为实例变量。

这是我的 UiButton 的 VC 代码:

class STECreateUserVC: UIViewController {

    @IBOutlet weak var imgAvatar: UIImageView!
    let cameraHandler = STECameraHandler()

    @IBAction func buttonPressed(_ sender: UIButton) {
        cameraHandler.importPictureIn(self) { [weak self] (image) in
            self?.imgAvatar.image = image
        }
    }
}

...这就是我的处理程序:

class STECameraHandler: NSObject {

    let imagePickerController = UIImagePickerController()
    var completitionClosure: ((UIImage) -> Void)?

    func importPictureIn(_ viewController: UIViewController, completitionHandler:((UIImage) -> Void)?) {
        completitionClosure = completitionHandler
        imagePickerController.delegate = self
        imagePickerController.allowsEditing = true
        imagePickerController.sourceType = .photoLibrary
        imagePickerController.mediaTypes = UIImagePickerController.availableMediaTypes(for: .photoLibrary)!
        viewController.present(imagePickerController, animated: true, completion: nil)
    }
}

extension STECameraHandler: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        if let completitionClosure = completitionClosure, let image = info[UIImagePickerControllerEditedImage] as? UIImage {
            completitionClosure(image)
        }
        imagePickerController.dismiss(animated: true)
    }
}

为了让代码更简洁,我使用了闭包。

【讨论】:

    【解决方案2】:

    这个:

    self.viewController.present(imagePicker, animated: true, completion: nil)
    

    应该是:

    self.present(imagePicker, animated: true, completion: nil)
    

    【讨论】:

    • 该类没有视图控制器。我创建了一个类来处理所有 UIImagePicker 函数,所以我创建了一个对使用该类的 viewcontroller 的弱引用,这就是我管理呈现 imagePicker 的方式
    • 你是如何将你的实际视图控制器的引用传递给weak var viewController:MyProfileVC!的?
    • 抱歉回复晚了。在 CameraPicker 的初始化方法中,我添加了一个参数让发送者将自己引用到弱变量中
    • 是的,我已经解决了这个问题,非常感谢 Bista 先生跟进我的问题。我很感激:)
    • 我也遇到了同样的问题……你是怎么解决的?你能发布你的代码吗?谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2021-12-16
    • 2017-04-27
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多