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

SwiftUI项目中无法为CorporateNavigationController设置标题的问题

解决SwiftUI中自定义UIKit导航控制器标题不生效的问题

你的问题根源在于两点:

  • SwiftUI的navigationTitle修饰符仅对原生NavigationStack/NavigationView生效,自定义的CorporateNavigationStack作为UIKit桥接组件,无法响应这个修饰符。
  • 原实现中根视图是空白UIViewController,既没有关联SwiftUI内容,也无法承接标题设置。

以下是修正方案:

第一步:重构CorporateNavigationStack

让组件支持嵌入SwiftUI根视图,并实现标题的传递与更新:

import SwiftUI
import CorporateKit

struct CorporateNavigationStack<Content: View>: UIViewControllerRepresentable {
    // 要嵌入的SwiftUI根视图
    let content: Content
    // 绑定标题,支持动态更新
    @Binding var title: String
    
    init(title: Binding<String>, @ViewBuilder content: () -> Content) {
        self._title = title
        self.content = content()
    }
    
    func makeUIViewController(context: Context) -> CorporateNavigationController {
        // 将SwiftUI视图包装为UIKit兼容的视图控制器
        let hostingController = UIHostingController(rootView: content)
        // 初始化自定义导航控制器并传入根视图
        let navController = CorporateNavigationController(rootViewController: hostingController)
        // 初始化时设置初始标题
        navController.topViewController?.title = title
        return navController
    }
    
    func updateUIViewController(_ uiViewController: CorporateNavigationController, context: Context) {
        // 标题绑定值变化时,同步更新UIKit导航控制器的标题
        uiViewController.topViewController?.title = title
    }
}

#Preview {
    CorporateNavigationStack(title: .constant("预览标题")) {
        Text("示例内容")
    }
}

第二步:在ContentView中正确使用

直接通过组件参数传递标题,无需使用SwiftUI原生的navigationTitle修饰符:

import SwiftUI

struct ContentView: View {
    // 用@State实现标题的动态修改
    @State private var navTitle = "首页"
    
    var body: some View {
        CorporateNavigationStack(title: $navTitle) {
            VStack(spacing: 20) {
                Text("欢迎来到首页")
                Button("修改标题") {
                    navTitle = "新标题"
                }
            }
        }
    }
}

#Preview {
    ContentView()
}

核心逻辑说明

  • 使用UIHostingController完成SwiftUI视图到UIKit视图控制器的转换,让自定义导航控制器能正确加载SwiftUI内容。
  • 通过@Binding实现标题的双向绑定,确保标题动态变化时能同步到UIKit导航控制器。
  • 放弃SwiftUI原生navigationTitle,因为它无法作用于桥接的UIKit组件,直接通过UIKit控制器的title属性设置品牌规范的导航标题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:13:14