当委托不是 UIViewController 时不调用 UIImagePickerControllerDelegate 方法
UIImagePickerControllerDelegate Methods Not Called When Delegate Not UIViewController
我有一个包含多张图片的视图,每张图片都旨在从设备的照片库中选择。
我遵循了 the Food Tracker tutorial 中的示例,使用点击手势识别器,每个图像视图一个。
我已将每个 UIImageView 的插座连接到我的视图控制器中。
选择图像时,我希望将设备照片库中的图像设置为所选 UIImageView 的图像 属性。我想这样做的方法是使用封装在 class 中的闭包,采用 UIImagePickerControllerDelegate 协议。但是,此 class 上的方法从未被调用。如果我改为让我的视图控制器成为委托,则可以正确调用方法(但我不知道要设置哪个图像)。
这里有一些代码需要说明:
// 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:)
)中都设置了断点(并打印到控制台)。
还有什么我需要实施的吗?或者这只是 "the wrong way to do it"?感谢您的帮助。
您的 ImagePicker
实例在 selectImageFromPhotoLibrary
函数结束时超出范围。因此,图像选择器的代表消失了。您需要保持对 ImagePicker
的强引用。使用实例变量是一个可能的选择。
我有一个包含多张图片的视图,每张图片都旨在从设备的照片库中选择。
我遵循了 the Food Tracker tutorial 中的示例,使用点击手势识别器,每个图像视图一个。
我已将每个 UIImageView 的插座连接到我的视图控制器中。
选择图像时,我希望将设备照片库中的图像设置为所选 UIImageView 的图像 属性。我想这样做的方法是使用封装在 class 中的闭包,采用 UIImagePickerControllerDelegate 协议。但是,此 class 上的方法从未被调用。如果我改为让我的视图控制器成为委托,则可以正确调用方法(但我不知道要设置哪个图像)。
这里有一些代码需要说明:
// 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:)
)中都设置了断点(并打印到控制台)。
还有什么我需要实施的吗?或者这只是 "the wrong way to do it"?感谢您的帮助。
您的 ImagePicker
实例在 selectImageFromPhotoLibrary
函数结束时超出范围。因此,图像选择器的代表消失了。您需要保持对 ImagePicker
的强引用。使用实例变量是一个可能的选择。