UIImagePickerController 可以直接在 Story Board 上使用吗?

Can UIImagePickerController be used directly on story board?

我的印象是 ViewController 用法类似:在故事板上,我们将 UIViewController 拖到场景上,然后更改其 class 类型,例如到 UIImagePickerController。 (我想做一个专门的选图场景)

但是后来发现直接subclass的话UIImagePickerController不行:

class TestUIImagePickerController: UIImagePickerController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.sourceType = .photoLibrary
        self.delegate = self
        // self.present(self, animated: true) // either comment it out or not, both way won't work. 
    }

但只有当我在故事板上放置一个 UIViewController,然后以编程方式构建一个 UIImagePickerController 时它才有效:

class SecondTestUIImagePickerController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()

        let picker = UIImagePickerController()
        picker.sourceType = .photoLibrary
        picker.delegate = self
        self.present(picker, animated: true)
    } 

请问我在第一个用法示例中是否遗漏了什么?是否必须以编程方式创建 UIImagePickerController 然后通过代理视图控制器 (UIVIewController) 呈现它?

self.present(self, animated: true) 

你不能self展示self,用另一个ViewController展示UIImagePickerController

UIImagePickerController 可以用在故事板上,在你的代码中,例如

class SecondTestUIImagePickerController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        let sb = UIStoryboard(name: "ImagePickerStoryboard", bundle: nil)
        let picker = sb.instantiateViewControllerWithIdentifier("ImagePicker") as! TestUIImagePickerController
        self.present(picker, animated: true)
}

请记住 UIImagePickerControllerUINavigationController

的子类