Ios 未调用UIImagePickerControllerDelegate函数

Ios 未调用UIImagePickerControllerDelegate函数,ios,iphone,swift,uiimagepickercontroller,Ios,Iphone,Swift,Uiimagepickercontroller,我有一个类,我在其中调用UIImagePickerController来选择一个图像并返回它,这样我就可以在代码中的其他地方使用它 现在我设置了委托并实现了所需的必要函数,但是没有调用委托函数 我的代码中存在问题的部分: import UIKit typealias PhotoTakingHelperCallback = (UIImage? -> Void) class PhotoTakingHelper: NSObject { weak var viewController

我有一个类,我在其中调用
UIImagePickerController
来选择一个图像并返回它,这样我就可以在代码中的其他地方使用它

现在我设置了委托并实现了所需的必要函数,但是没有调用委托函数

我的代码中存在问题的部分:

import UIKit

typealias PhotoTakingHelperCallback = (UIImage? -> Void)

class PhotoTakingHelper: NSObject
{

    weak var viewController:UIViewController!
    var callback: PhotoTakingHelperCallback
    var imagePickerController: UIImagePickerController?

    init(viewController:UIViewController , callback:PhotoTakingHelperCallback) {

        self.viewController = viewController

        self.callback = callback
        super.init()
        showPhotoSourceSelection()
    }


    func showPhotoSourceSelection() {
        let alertController = UIAlertController(title: nil, message: "Where do you want to get your picture from?", preferredStyle: .ActionSheet)

        let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)

        alertController.addAction(cancelAction)

        let photoLibraryAction = UIAlertAction(title: "Photo from Library", style: .Default) { (action) -> Void in
            self.showImagePickerController(.PhotoLibrary)
        }

        alertController.addAction(photoLibraryAction)

        if (UIImagePickerController.isCameraDeviceAvailable(.Rear) ) {
            let cameraAction = UIAlertAction(title: "Photo from Camera", style: .Default, handler: { (action) -> Void in
                self.showImagePickerController(.Camera)
            })

            alertController.addAction(cameraAction)
        }

        viewController.presentViewController(alertController, animated: true, completion: nil)

    }

    func showImagePickerController(sourceType: UIImagePickerControllerSourceType) {
        imagePickerController = UIImagePickerController()
        imagePickerController!.delegate = self
        imagePickerController!.sourceType = sourceType

        print("Set the delegate \(imagePickerController?.delegate?.isMemberOfClass(PhotoTakingHelper))")

        self.viewController.presentViewController(imagePickerController!, animated: true, completion: nil)
    }

}


extension PhotoTakingHelper: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        print("HELLO?")
    }

    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {

        viewController.dismissViewControllerAnimated(false, completion: nil)
        print("calling the callback now " )

        callback(image)

        print("Finished calling the callback")
    }


}
我检查了很多,但没有一个解决了这个问题

我意识到没有一个委托方法被调用,因为当我在模拟器上运行程序并在照片库中选择图像时,控制台只打印图像

将委托设置为可选(true)


您正在创建一个
PhotoTakingHelper
,但没有保留对它的引用。也就是说,你在做这样的事情:

// In your view controller

@IBAction func pickImageButtonWasTapped() {
    _ = PhotoTakingHelper(viewController: self) { image in
        print("Callback!")
    }
}
// In your view controller

var helper: PhotoTakingHelper?

@IBAction func pickImageButtonWasTapped() {
    helper = PhotoTakingHelper(viewController: self) { image in
       print("Callback!")
    }
}
// In PhotoTakingHelper

var me: PhotoTakingHelper?

init(viewController:UIViewController , callback:PhotoTakingHelperCallback) {
    self.viewController = viewController
    self.callback = callback
    super.init()
    me = self
    showPhotoSourceSelection()
}
UIImagePickerController
只保留对其委托的弱引用,这不足以使其保持活动状态,因此必须保留对它的强引用。可以通过将辅助对象存储在视图控制器的实例变量中来实现,如下所示:

// In your view controller

@IBAction func pickImageButtonWasTapped() {
    _ = PhotoTakingHelper(viewController: self) { image in
        print("Callback!")
    }
}
// In your view controller

var helper: PhotoTakingHelper?

@IBAction func pickImageButtonWasTapped() {
    helper = PhotoTakingHelper(viewController: self) { image in
       print("Callback!")
    }
}
// In PhotoTakingHelper

var me: PhotoTakingHelper?

init(viewController:UIViewController , callback:PhotoTakingHelperCallback) {
    self.viewController = viewController
    self.callback = callback
    super.init()
    me = self
    showPhotoSourceSelection()
}
或者,您可以让助手保留对自身的引用,如下所示:

// In your view controller

@IBAction func pickImageButtonWasTapped() {
    _ = PhotoTakingHelper(viewController: self) { image in
        print("Callback!")
    }
}
// In your view controller

var helper: PhotoTakingHelper?

@IBAction func pickImageButtonWasTapped() {
    helper = PhotoTakingHelper(viewController: self) { image in
       print("Callback!")
    }
}
// In PhotoTakingHelper

var me: PhotoTakingHelper?

init(viewController:UIViewController , callback:PhotoTakingHelperCallback) {
    self.viewController = viewController
    self.callback = callback
    super.init()
    me = self
    showPhotoSourceSelection()
}
然后,在完成图像选取器时,需要将引用设置为nil,以便释放辅助对象:

extension PhotoTakingHelper: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        viewController.dismissViewControllerAnimated(false, completion: nil)
        callback(info[UIImagePickerControllerOriginalImage] as? UIImage)
        me = nil
    }

    func imagePickerControllerDidCancel(picker: UIImagePickerController) {
        viewController.dismissViewControllerAnimated(false, completion: nil)
        me = nil
    }

}

您正在创建一个
PhotoTakingHelper
,但没有保留对它的引用。也就是说,你在做这样的事情:

// In your view controller

@IBAction func pickImageButtonWasTapped() {
    _ = PhotoTakingHelper(viewController: self) { image in
        print("Callback!")
    }
}
// In your view controller

var helper: PhotoTakingHelper?

@IBAction func pickImageButtonWasTapped() {
    helper = PhotoTakingHelper(viewController: self) { image in
       print("Callback!")
    }
}
// In PhotoTakingHelper

var me: PhotoTakingHelper?

init(viewController:UIViewController , callback:PhotoTakingHelperCallback) {
    self.viewController = viewController
    self.callback = callback
    super.init()
    me = self
    showPhotoSourceSelection()
}
UIImagePickerController
只保留对其委托的弱引用,这不足以使其保持活动状态,因此必须保留对它的强引用。可以通过将辅助对象存储在视图控制器的实例变量中来实现,如下所示:

// In your view controller

@IBAction func pickImageButtonWasTapped() {
    _ = PhotoTakingHelper(viewController: self) { image in
        print("Callback!")
    }
}
// In your view controller

var helper: PhotoTakingHelper?

@IBAction func pickImageButtonWasTapped() {
    helper = PhotoTakingHelper(viewController: self) { image in
       print("Callback!")
    }
}
// In PhotoTakingHelper

var me: PhotoTakingHelper?

init(viewController:UIViewController , callback:PhotoTakingHelperCallback) {
    self.viewController = viewController
    self.callback = callback
    super.init()
    me = self
    showPhotoSourceSelection()
}
或者,您可以让助手保留对自身的引用,如下所示:

// In your view controller

@IBAction func pickImageButtonWasTapped() {
    _ = PhotoTakingHelper(viewController: self) { image in
        print("Callback!")
    }
}
// In your view controller

var helper: PhotoTakingHelper?

@IBAction func pickImageButtonWasTapped() {
    helper = PhotoTakingHelper(viewController: self) { image in
       print("Callback!")
    }
}
// In PhotoTakingHelper

var me: PhotoTakingHelper?

init(viewController:UIViewController , callback:PhotoTakingHelperCallback) {
    self.viewController = viewController
    self.callback = callback
    super.init()
    me = self
    showPhotoSourceSelection()
}
然后,在完成图像选取器时,需要将引用设置为nil,以便释放辅助对象:

extension PhotoTakingHelper: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        viewController.dismissViewControllerAnimated(false, completion: nil)
        callback(info[UIImagePickerControllerOriginalImage] as? UIImage)
        me = nil
    }

    func imagePickerControllerDidCancel(picker: UIImagePickerController) {
        viewController.dismissViewControllerAnimated(false, completion: nil)
        me = nil
    }

}

我想你的imagePickerController在委托方法调用之前就发布了…试着让它成为全局的…我的意思是声明为propertyyes,但我在代码示例中没有它,我现在添加它以防止混淆我想你的imagePickerController是在委托方法调用之前发布的…只是试着使其全局化…我的意思是声明为propertyyes我有,但我在代码示例中没有,我现在添加它以防混淆Hey@rob,尚未测试代码,但我想知道您是否可以向我发送任何链接,进一步解释为什么代理具有弱引用和整个强/弱引用,因为我发现它确实令人困惑!谢谢我也有同样的问题。通过将PhotoTakingHelper设置为我的视图控制器的类属性,修复了此问题。谢谢@robmayoffHey@rob,我还没有测试代码,但是我想知道你是否可以给我发送任何链接,进一步解释为什么代理有一个弱引用和整个强/弱引用,因为我发现它真的很混乱!谢谢我也有同样的问题。通过将PhotoTakingHelper设置为我的视图控制器的类属性,修复了此问题。谢谢@robmayoff