Ios 当委托不是UIViewController时未调用UIImagePickerController方法

Ios 当委托不是UIViewController时未调用UIImagePickerController方法,ios,swift,uiimagepickercontroller,Ios,Swift,Uiimagepickercontroller,我有一个包含多个图像的视图,每个图像都是从设备的照片库中选择的 我遵循了一个例子,使用点击手势识别器,每个图像视图一个 我已将每个UIImageView的插座连接到视图控制器 选择图像时,我希望将设备照片库中的图像设置为所选UIImageView的image属性。我认为这样做的方法是使用封装到采用UIImagePickerController协议的类中的闭包。但是,永远不会调用此类上的方法。如果我改为将视图控制器作为委托,则会正确调用这些方法(但我不知道要设置哪个图像) 下面是一些需要澄清的代码

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

我遵循了一个例子,使用点击手势识别器,每个图像视图一个

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

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

下面是一些需要澄清的代码:

// 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)
}
这些方法永远不会被调用。我已经在闭包和两个委托方法(
ImagePickerControllerIDCancel(\u:)
imagePickerController(\uFinishPickingMediaWithInfo:)
)中设置了断点(并打印到控制台)


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

您的
ImagePicker
实例在
selectImageFromPhotoLibrary
函数末尾超出范围。因此,图像选取器的委托消失了。您需要保留对
图像选择器的强引用。使用实例变量是一种可能的选择。

您的
ImagePicker
超出了
selectImageFromPhotoLibrary
函数末尾的范围。因此,图像选取器的委托消失了。您需要保留对
ImagePicker
的强引用。谢谢,rmaddy。你说得对。只需将变量移动到实例变量,就可以调用这些方法。现在我需要弄清楚为什么调用该方法不起作用。很明显,我需要进一步了解Swift内存管理。以及为什么没有报告错误。如果你把你的评论转换成一个答案,我会接受。我做错的另一件事是打电话选择。它应该是
select(图像:selectedImage)