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])

你应该有更好的运气。

问题出在你的ActivitiesMainPageControllerclass。这是一个内存管理问题。您创建 takePictures class 的本地实例(仅供参考 - class 名称应以大写字母开头),然后调用 presentCamera 方法。然后 takePictureInstance 变量立即超出范围。这意味着它没有更多的引用并被释放。

所以在这一点上,图像选择器的(弱)委托变为 nil。这就是为什么永远不会调用图像选择器委托方法的原因。

有两种方法可以解决这个问题:

  1. ActivitiesMainPageController class 中保留对 takePictures 实例的强引用(使用 属性 而不是局部变量)。但是这样就有了不知道什么时候释放实例的问题。
  2. 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
    }
}