You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 06:04:56