在使用相机拍摄图像时UIImagePickerController
的委托中,另一个视图被推送到导航堆栈:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
picker.pushViewController(otherViewController, animated: true)
}
在otherViewController
导航栏可见:
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.setNavigationBarHidden(false, animated: false)
}
点击导航栏中的< Back
按钮后,导航栏再次变为不可见,出现摄像机视图,但摄像机图像冻结,点击底栏按钮无效。
为什么?
答案 0 :(得分:1)
解决方法是不要让用户通过用Back
按钮替换Cancel
按钮来导航回来。这解散了UIImagePickerController并自动关闭导航堆栈上的所有更高视图,包括otherViewController
。
// Replace `Back` button with `Cancel` button in the `otherViewController`
navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(self.cancelButtonTapped))
@objc func cancelButtonTapped() {
// Dismiss the `UINavigationController`, e.g. by calling a delegate function
// ...
}
因此,用户必须从头开始再次启动流程,而不是仅仅导航回来。
答案 1 :(得分:0)
你在解雇你提出的选择器之前直接推动一个新的视图这就是为什么当你回来时你的相机图像选择器仍然在堆栈中因为它没有被解雇
dismiss(animated:true, completion: nil)
在此之后推送您的新视图。 didFInish用于获取结果并解除您使用的选择器传递图像选择或点击新控制器(如果需要)但需要解雇选择器