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

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的.tint modifier优先级高于UIKit的外观设置,更适配SwiftUI导航栈的管理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:29:50