UIKit中从两个源控制器模态呈现带导航栏的目标控制器问题
解决UIKit中多源控制器模态呈现带导航栏的编辑控制器问题
方案一:复用单个Storyboard Segue,代码触发
- 在Storyboard中,给任意一个源控制器添加到导航控制器的模态Segue,设置唯一标识(如
showEditViewController) - 另一个源控制器通过代码触发该Segue:
@IBAction func openEditVC(_ sender: UIButton) { performSegue(withIdentifier: "showEditViewController", sender: self) } - 统一实现
prepare(for:sender:),确保正确获取编辑控制器,避免init(coder)错误:
注意:编辑控制器若自定义初始化方法,必须保留override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard segue.identifier == "showEditViewController", let navVC = segue.destination as? UINavigationController, let editVC = navVC.topViewController as? EditViewController else { return } // 传递数据,比如 editVC.targetItem = self.selectedItem }required init?(coder: NSCoder)的正确实现,否则会触发致命错误。
方案二:纯代码构建导航控制器与编辑控制器
完全脱离Storyboard Segue的限制,两个源控制器用相同逻辑创建并呈现:
@IBAction func openEditVC(_ sender: UIButton) { // 从Storyboard实例化编辑控制器(或用代码初始化) let editVC = UIStoryboard(name: "Main", bundle: nil) .instantiateViewController(withIdentifier: "EditVC") as! EditViewController // 包裹导航控制器 let navVC = UINavigationController(rootViewController: editVC) // 添加导航栏按钮 editVC.navigationItem.leftBarButtonItem = UIBarButtonItem( barButtonSystemItem: .cancel, target: self, action: #selector(dismissEditVC) ) editVC.navigationItem.rightBarButtonItem = UIBarButtonItem( barButtonSystemItem: .save, target: self, action: #selector(saveChanges) ) present(navVC, animated: true) } @objc private func dismissEditVC() { dismiss(animated: true) } @objc private func saveChanges() { // 处理保存逻辑 dismiss(animated: true) }
方案三:用Storyboard Reference复用编辑流程
- 创建独立的
EditFlow.storyboard,将导航控制器+编辑控制器放入其中,设置导航控制器为初始控制器 - 在主Storyboard中,给两个源控制器分别添加模态Segue到Storyboard Reference,指向
EditFlow.storyboard - 在
prepare(for:sender:)中,依然通过导航控制器的topViewController获取编辑控制器,传递数据逻辑同方案一
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

