didFinishPickingImage 没有被触发
didFinishPickingImage does not get triggered
我有一个class
class ActivitiesMainPageController: UICollectionViewController ,UIImagePickerControllerDelegate, UINavigationControllerDelegate{
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
switch indexPath.item {
case 0 :
let takePictureInstance = takePictures()
takePictureInstance.presentCamera()
}
}
takePictures() 是自定义的 class
class takePictures: UIViewController, UIImagePickerControllerDelegate, UIAlertViewDelegate, UINavigationControllerDelegate
{
var imagePicker: UIImagePickerController! = UIImagePickerController()
func presentCamera()
{
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera)
{
let objViewController = UIApplication.shared.keyWindow?.rootViewController
imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.allowsEditing = false
imagePicker.sourceType = UIImagePickerControllerSourceType.camera
objViewController?.present(imagePicker,animated: true,completion: nil)
}
else
{
// error msg
print ("error displaying Camera")
noCamera()
}
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
print(self.Tag + "image picker controller")
self.dismiss(animated: true, completion: nil)
}
}
didfinishpickingimage 永远不会被触发。我没有看到打印语句。阅读 SO here, 后,我认为我没有正确执行委托。你能帮忙吗?
为什么要显示 takePictures
class(应该是 TakePictures
)的 UIImagePicker?我认为问题的根源是因为您当前所在的视图控制器不是呈现选择器的视图控制器。如果您将 presentCamera()
函数拉出并将其放入 ActivitiesMainPageController
并指定 <- 作为委托并将方法签名切换为正确的方法签名:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
你应该有更好的运气。
问题出在你的ActivitiesMainPageController
class。这是一个内存管理问题。您创建 takePictures
class 的本地实例(仅供参考 - class 名称应以大写字母开头),然后调用 presentCamera
方法。然后 takePictureInstance
变量立即超出范围。这意味着它没有更多的引用并被释放。
所以在这一点上,图像选择器的(弱)委托变为 nil
。这就是为什么永远不会调用图像选择器委托方法的原因。
有两种方法可以解决这个问题:
- 在
ActivitiesMainPageController
class 中保留对 takePictures
实例的强引用(使用 属性 而不是局部变量)。但是这样就有了不知道什么时候释放实例的问题。
- 在
takePictures
class 中执行一个小技巧,它在创建时保持对自身的强引用,然后在关闭图像选择器后释放该强引用。
方案2可以这样实现:
class takePictures: UIViewController, UIImagePickerControllerDelegate, UIAlertViewDelegate, UINavigationControllerDelegate
{
var strongSelf: takePictures?
var imagePicker: UIImagePickerController! = UIImagePickerController()
func presentCamera()
{
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera)
{
let objViewController = UIApplication.shared.keyWindow?.rootViewController
imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.allowsEditing = false
imagePicker.sourceType = UIImagePickerControllerSourceType.camera
objViewController?.present(imagePicker,animated: true,completion: nil)
strongSelf = self // keep me around
}
else
{
// error msg
print ("error displaying Camera")
noCamera()
}
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
print(self.Tag + "image picker controller")
self.dismiss(animated: true, completion: nil)
strongSelf = nil // let me go
}
}
我有一个class
class ActivitiesMainPageController: UICollectionViewController ,UIImagePickerControllerDelegate, UINavigationControllerDelegate{
override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
switch indexPath.item {
case 0 :
let takePictureInstance = takePictures()
takePictureInstance.presentCamera()
}
}
takePictures() 是自定义的 class
class takePictures: UIViewController, UIImagePickerControllerDelegate, UIAlertViewDelegate, UINavigationControllerDelegate
{
var imagePicker: UIImagePickerController! = UIImagePickerController()
func presentCamera()
{
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera)
{
let objViewController = UIApplication.shared.keyWindow?.rootViewController
imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.allowsEditing = false
imagePicker.sourceType = UIImagePickerControllerSourceType.camera
objViewController?.present(imagePicker,animated: true,completion: nil)
}
else
{
// error msg
print ("error displaying Camera")
noCamera()
}
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
print(self.Tag + "image picker controller")
self.dismiss(animated: true, completion: nil)
}
}
didfinishpickingimage 永远不会被触发。我没有看到打印语句。阅读 SO here, 后,我认为我没有正确执行委托。你能帮忙吗?
为什么要显示 takePictures
class(应该是 TakePictures
)的 UIImagePicker?我认为问题的根源是因为您当前所在的视图控制器不是呈现选择器的视图控制器。如果您将 presentCamera()
函数拉出并将其放入 ActivitiesMainPageController
并指定 <- 作为委托并将方法签名切换为正确的方法签名:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
你应该有更好的运气。
问题出在你的ActivitiesMainPageController
class。这是一个内存管理问题。您创建 takePictures
class 的本地实例(仅供参考 - class 名称应以大写字母开头),然后调用 presentCamera
方法。然后 takePictureInstance
变量立即超出范围。这意味着它没有更多的引用并被释放。
所以在这一点上,图像选择器的(弱)委托变为 nil
。这就是为什么永远不会调用图像选择器委托方法的原因。
有两种方法可以解决这个问题:
- 在
ActivitiesMainPageController
class 中保留对takePictures
实例的强引用(使用 属性 而不是局部变量)。但是这样就有了不知道什么时候释放实例的问题。 - 在
takePictures
class 中执行一个小技巧,它在创建时保持对自身的强引用,然后在关闭图像选择器后释放该强引用。
方案2可以这样实现:
class takePictures: UIViewController, UIImagePickerControllerDelegate, UIAlertViewDelegate, UINavigationControllerDelegate
{
var strongSelf: takePictures?
var imagePicker: UIImagePickerController! = UIImagePickerController()
func presentCamera()
{
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.camera)
{
let objViewController = UIApplication.shared.keyWindow?.rootViewController
imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.allowsEditing = false
imagePicker.sourceType = UIImagePickerControllerSourceType.camera
objViewController?.present(imagePicker,animated: true,completion: nil)
strongSelf = self // keep me around
}
else
{
// error msg
print ("error displaying Camera")
noCamera()
}
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
print(self.Tag + "image picker controller")
self.dismiss(animated: true, completion: nil)
strongSelf = nil // let me go
}
}