【问题标题】:UIImagePickerControllerDelegate Methods Not Called When Delegate Not UIViewController当委托不是 UIViewController 时未调用 UIImagePickerControllerDelegate 方法
【发布时间】:2016-01-21 02:46:36
【问题描述】:

我有一个包含多个图像的视图,每个图像都打算从设备的照片库中选择。

我遵循the Food Tracker tutorial 中的示例,使用点击手势识别器,每个图像视图一个。

我已将每个 UIImageView 的插座连接到我的视图控制器中。

选择图像时,我希望从设备的照片库中的图像设置为所选UIImageView的映像属性。我想这样做的方法是使用封装到采用 UIImagePickerControllerDelegate 协议的类中的闭包。但是,永远不会调用此类上的方法。如果我改为让我的视图控制器成为委托,则方法会被正确调用(但我不知道要设置哪个图像)。

这里有一些代码需要澄清:

// Encapsulate callbacks for the selected image
class ImagePicker: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    var select: (image: UIImage) -> Void
    var cancel: () -> Void

    init(select: (image: UIImage) -> Void, cancel: () -> Void) {
        self.select = select
        self.cancel = cancel
    }

    func imagePickerControllerDidCancel(picker: UIImagePickerController) {
        cancel()
    }

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        let selectedImage = info[UIImagePickerControllerOriginalImage] as! UIImage
        select(selectedImage)
    }
}

然后在我的视图控制器中,我将此方法连接到手势识别器:

@IBAction func selectImageFromPhotoLibrary(sender: UITapGestureRecognizer) {
    textField.resignFirstResponder()

    let imagePickerController = UIImagePickerController()
    imagePickerController.sourceType = .PhotoLibrary

    let imagePicker = ImagePicker(
        select: {(image: UIImage) -> Void in
            let imageView = sender.view as! UIImageView
            imageView.image = image
            self.dismissViewControllerAnimated(true, completion: nil)
        },
        cancel: {() -> Void in
            self.dismissViewControllerAnimated(true, completion: nil)
        }
    )
    imagePickerController.delegate = imagePicker
    presentViewController(imagePickerController, animated: true, completion: nil)
}

永远不会调用这些方法。我在闭包和两个委托方法(imagePickerControllerDidCancel(_:)imagePickerController(_:didFinishPickingMediaWithInfo:))中都设置了断点(并打印到控制台)。

还有什么我需要实现的吗?或者这只是“错误的做法”?感谢您的帮助。

【问题讨论】:

  • 您的ImagePickerselectImageFromPhotoLibrary 函数结束时超出范围。因此,图像选择器的代表消失了。您需要保持对ImagePicker 的强烈引用。
  • 谢谢,rmaddy。你是对的。只需将变量移动到实例变量即可调用方法。现在我需要弄清楚为什么调用该方法不起作用。我显然需要进一步了解 Swift 内存管理。以及为什么没有报告错误。如果您将评论转换为答案,我会接受。
  • 我做错的其他事情是调用选择。应该是select(image: selectedImage)

标签: ios swift uiimagepickercontroller


【解决方案1】:

您的ImagePicker 实例在selectImageFromPhotoLibrary 函数结束时超出范围。因此,图像选择器的代表消失了。您需要保持对ImagePicker 的强烈引用。使用实例变量是一种可能的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 2016-05-24
    • 2011-08-12
    相关资源
    最近更新 更多