iOS15下SwiftUI跳转UIKit控制器:无法移除返回按钮标题及修改tint色
解决方案
1. 移除返回按钮标题
返回按钮的标题由跳转前的SwiftUI页面(ContentView)的导航项控制,而非当前UIKit控制器。需要在ContentView中配置前页面的导航属性:
在ContentView的VStack中添加.onAppear回调,修改当前页面的导航项设置:
.onAppear { guard let navVC = UIApplication.shared.windows.first?.rootViewController as? UINavigationController else { return } // 设置空标题的返回按钮 navVC.topViewController?.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) // 强制使用最小化模式(仅显示箭头) navVC.topViewController?.navigationItem.backButtonDisplayMode = .minimal }
2. 修改返回按钮的tint颜色
有两种可靠方式:
方法一:SwiftUI全局统一设置
直接给NavigationView添加.tint modifier,会自动应用到所有导航栏按钮(包括返回按钮):
NavigationView { // 页面内容 } .tint(.systemPink)
方法二:UIKit控制器单独设置
如果需要针对当前UIKit页面单独设置,在viewWillAppear中修改导航栏的tintColor:
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) navigationController?.navigationBar.tintColor = .systemPink }
整合后的完整代码
import SwiftUI import UIKit struct ContentView: View { var body: some View { NavigationView { VStack { NavigationLink(destination: MyViewControllerRepresentable() .navigationTitle("TitleFromSwiftUI")) { Text("MyVC") } Spacer() } .navigationTitle("Top") .navigationBarTitleDisplayMode(.inline) .onAppear { // 移除返回按钮标题 guard let navVC = UIApplication.shared.windows.first?.rootViewController as? UINavigationController else { return } navVC.topViewController?.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) navVC.topViewController?.navigationItem.backButtonDisplayMode = .minimal } } .tint(.systemPink) // 全局设置导航栏按钮tint颜色 } } struct MyViewControllerRepresentable: UIViewControllerRepresentable { func makeUIViewController(context: Context) -> MyViewController { return MyViewController() } func updateUIViewController(_ uiViewController: MyViewController, context: Context) {} } class MyViewController : UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white let button = UIButton(primaryAction: UIAction { _ in let nextVC = MyViewController() // UIKit内部跳转时,直接设置目标页面的返回按钮模式 nextVC.navigationItem.backButtonDisplayMode = .minimal self.navigationController?.pushViewController(nextVC, animated: true) }) button.frame = CGRect(x: 100, y: 150, width: 200, height: 40) button.setTitle("Push Another VC", for: .normal) button.setTitleColor(.systemPink, for: .normal) view.addSubview(button) } } #Preview { ContentView() }
关键说明
- 跳转规则:A页面跳转到B页面时,B的返回按钮标题由A的导航项决定,所以SwiftUI到UIKit的跳转需要在SwiftUI页面配置,而非UIKit控制器。
- UIKit内部跳转:如果是UIKit控制器之间的跳转,直接在目标控制器设置
navigationItem.backButtonDisplayMode = .minimal即可生效。 - Tint颜色优先级:SwiftUI的
.tintmodifier优先级高于UIKit的外观设置,更适配SwiftUI导航栈的管理逻辑。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

