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

求助:嵌套在分页TabView中的NavigationStack渲染异常

解决TabView Page样式嵌套NavigationStack的渲染异常问题

我需要实现带导航栏的横向分页效果,但使用TabView并设置.page样式时,内部嵌套多个NavigationStack会出现渲染异常。

正常工作的标签式代码

var body: some View {
  TabView(selection: $selectedTab) {
    NavigationStack {
      List {
        Text("Page 1")
      }
      .tag(LandingPage.activity)
      .navigationTitle("Title")
    }
    .tabItem {
      Text("Tab 1")
    }
    NavigationStack {
      List {
        Text("Page 2")
      }
      .tag(LandingPage.activity)
      .navigationTitle("Title 2")
    }
    .tabItem {
      Text("Tab 2")
    }
  }.tabViewStyle(.automatic)
}

切换为Page样式后出现渲染异常的代码

var body: some View {
  TabView(selection: $selectedTab) {
    NavigationStack {
      List {
        Text("Page 1")
      }
      .tag(LandingPage.activity)
      .navigationTitle("Title")
    }
    NavigationStack {
      List {
        Text("Page 2")
      }
      .tag(LandingPage.activity)
      .navigationTitle("Title 2")
    }
  }.tabViewStyle(.page)
}

解决方案

问题根源在于多个NavigationStack嵌套在.page样式的TabView内部时,会触发布局冲突。正确的做法是将NavigationStack提升到TabView外层,让整个分页容器共享同一个导航栈,每个分页页面作为导航栈的根内容:

var body: some View {
  NavigationStack {
    TabView(selection: $selectedTab) {
      // 分页页面1
      List {
        Text("Page 1")
      }
      .tag(LandingPage.activity)
      .navigationTitle("Title")
      
      // 分页页面2
      List {
        Text("Page 2")
      }
      .tag(LandingPage.another) // 注意修正重复的tag值,确保与枚举成员一一对应
      .navigationTitle("Title 2")
    }
    .tabViewStyle(.page)
    .navigationBarTitleDisplayMode(.inline) // 可选:统一设置导航栏显示模式
  }
}

额外注意事项

  • 原代码中两个页面使用了相同的.tag(LandingPage.activity),这会导致TabView的选择逻辑失效,必须修正为对应不同的枚举成员。
  • 每个分页页面仍可通过.navigationTitle、.toolbar等修饰符单独配置导航栏内容,外层NavigationStack会自动适配页面切换时的导航栏变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:13:19