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

如何使用Swift编程创建UINavigationBar导航栏

问题原因与解决方案

核心问题

  • 你当前的代码默认依赖导航栈获取导航栏,若跳转时未将第二个控制器加入主控制器的导航栈,self.navigationController会为空,所有导航栏相关配置都会失效
  • 导航栏标题设置的目标对象错误,不应该修改navigationController的navigationItem,需要修改当前控制器自身的navigationItem
  • 无自定义导航栏需求的情况下不需要设置UINavigationBarDelegate代理,多余配置可能引发未知问题

修复步骤

步骤1:确认Segue跳转类型

打开Storyboard找到id为goToRecentSearchVC的Segue,将类型设置为Show (Push),该类型会自动将第二个控制器压入主控制器的导航栈,继承已有导航栏配置。

步骤2:修正第二个控制器的代码

替换RecentSearchTVC的代码为以下内容:

import UIKit

class RecentSearchTVC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // 无自定义导航栏需求可移除代理设置
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // 配置当前控制器的导航项
        self.navigationItem.title = "Test"
        // 修改导航栏样式
        self.navigationController?.navigationBar.barTintColor = .red
        // 强制确保导航栏不隐藏
        self.navigationController?.setNavigationBarHidden(false, animated: animated)
    }
}

可选方案:需要模态弹出带导航栏的控制器

如果业务需求需要模态弹出第二个控制器,而不是推入导航栈,需要给第二个控制器包裹一个UINavigationController:

  1. 在Storyboard中将Segue的目标设置为UINavigationController,将该导航控制器的根控制器设置为RecentSearchTVC
  2. 跳转后第二个控制器就可以正常获取到navigationController对象,导航栏会正常显示

内容的提问来源于stack exchange,提问作者Joco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 20:24:03