如何使用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:
- 在Storyboard中将Segue的目标设置为UINavigationController,将该导航控制器的根控制器设置为
RecentSearchTVC - 跳转后第二个控制器就可以正常获取到
navigationController对象,导航栏会正常显示
内容的提问来源于stack exchange,提问作者Joco
相关产品推荐
相关产品推荐

