委托不是UIViewController时不调用的UIImagePickerControllerDelegate方法

时间:2015-10-21 22:52:51

标签: ios swift uiimagepickercontroller

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

我按照the Food Tracker tutorial的示例,使用Tap Gesture Recognizers,每个图像视图一个。

我已将每个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:))中设置了断点(并打印到控制台)。

我还需要实施其他什么吗?或者这只是"错误的做法"?谢谢你的帮助。

1 个答案:

答案 0 :(得分:4)

您的ImagePicker实例超出selectImageFromPhotoLibrary功能末尾的范围。因此,图像选择器的委托已经消失。您需要对ImagePicker保持强有力的引用。使用实例变量可能是一种选择。