SwiftUI:更改基于 NavigationBarTitle 的 TabbedView 标签的更好方法

zer*_*dge 1 swift swiftui

终于能够NavigationView根据TabbedViewusing 中的当前选项卡弄清楚如何更改我的标题onAppear(),但我很确定这不是解决问题的方法:

struct SomeTabbedView : View {
  @State private var selection = 0
  @State private var title = "First"
  var body: some View {
    NavigationView {
      TabbedView(selection: $selection) {
        ContentView()
          .tabItemLabel(
            Text("First")
          ).tag(0).onAppear{
            self.title = "First"
        }

        OtherView()
          .tabItemLabel(
            Text("Second")
          ).tag(1).onAppear{
            self.title = "Second"
          }
        }.navigationBarTitle(Text(title))
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

简而言之,这严重违反了 DRY 原则。如果我们决定更改第一个视图,例如字符串“First”,则当前的实现将需要在三个不同的地方重复该操作。

我想初始化一个字典数组并遍历View: Label对,但我不仅不确定这是正确的方法,而且我不确定如何继续实现它。也可以只拥有一个带有标签的数组,但是如果我们想要更改视图的顺序,这会产生另一个违规行为。

vac*_*ama 8

您的顶级视图应该是TabbedView,并且每个选项卡都应该有自己的NavigationView。这并没有解决“First”同时用于 the.navigationBarTitle和 the 的.tabItemLabel事实,但实际上它们是两个不同的东西,可以不同。

struct SomeTabbedView : View {
    @State private var selection = 0

    var body: some View {

        TabbedView(selection: $selection) {
            NavigationView {
                ContentView()
                    .navigationBarTitle(Text("First"))
            }
            .tabItemLabel(Text("First"))
            .tag(0)

            NavigationView {
                OtherView()
                    .navigationBarTitle(Text("Second"))
            }
            .tabItemLabel(Text("Second"))
            .tag(1)
        }.edgesIgnoringSafeArea(.top)
    }
}
Run Code Online (Sandbox Code Playgroud)