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

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

我在Food Tracker教程中使用了Tap Gesture Recognizers,每个图像视图都有一个例子。

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

选择图像时,我希望将设备照片库中的图像设置为所选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:) )中设置了断点(并打印到控制台)。

还有其他我需要实现的东西吗? 或者这只是“做错的方法”? 谢谢你的帮助。

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