SwiftUI ToolbarItem无法显示来自NavigationLink的视图

时间:2020-08-26 16:53:06

标签: swiftui

我不知道这是否是错误,或者我在这里做错了什么。我在导航栏上添加了一个新按钮,它将显示一个新视图。

struct MyView: View {
  
  @ObservedObject var viewModel = MyViewModel()
  
  var body: some View {
    List(viewModel.data, id: \.name) { data in
      NavigationLink(destination: MyDetailView(data: data.name)) {
        Text(data.name)
      }
    }
    .listStyle(InsetGroupedListStyle())
    .edgesIgnoringSafeArea(.all)
    .toolbar {
      ToolbarItem(placement: .navigationBarTrailing) {  
        NavigationLink(destination: MyDetailView()) {
          Text("New Element")
        }
      }
    }
  }
}

正在最新的iOS 14 beta(测试版6)和Xcode 12(测试版6)上对此进行测试。据我所知,当在列表上但在工具栏中时,导航链接可以很好地显示新视图,如图所示并非如此。工具栏上的按钮是可见的且处于活动状态,但不会触发显示新视图。

3 个答案:

答案 0 :(得分:9)

NavigationLink应该在内部 NavigationView。工具栏不在NavigationView中,在其中放置按钮。

所以假设您在父母的某个地方

NavigationView {
   MyView()
}

这是一个解决方案:

struct MyView: View {
  
  @ObservedObject var viewModel = MyViewModel()
  @State private var showNew = false

  var body: some View {
    List(viewModel.data, id: \.name) { data in
      NavigationLink(destination: MyDetailView(data: data.name)) {
        Text(data.name)
      }
    }
    .listStyle(InsetGroupedListStyle())
    .background(
        NavigationLink(destination: MyDetailView(), isActive: $showNew) {
          EmptyView()
        }
    )
    .edgesIgnoringSafeArea(.all)
    .toolbar {
      ToolbarItem(placement: .navigationBarTrailing) {  
        Button("New Element") {
            self.showNew = true
        }
      }
    }
  }
}

答案 1 :(得分:7)

我发现使用带有空文本的HStack作为第一个元素也可以使用,它可以使NavigationLink正确运行。

        .toolbar {
        ToolbarItem(placement: .navigationBarLeading) {
            HStack {
                Text("")
                NavigationLink(destination: SettingsView()) {
                    Image(systemName: "gear")
                        .font(.title)
                }
            }
        }

答案 2 :(得分:1)

如果您的导航链接指向带有键盘输入的视图,则使用Asperi解决方案可能无法正常工作。

在导航链接之后,新视图中的工具栏已正确加载,但在使用键盘提供输入并关闭键盘时所有工具栏项均消失

解决方案是将NavigationLink不在View中,而是在NavigationBarItems中,例如:

.navigationBarItems(
                leading:
                    NavigationLink(
                        destination: Creator(),
                        isActive: $showCreator,
                        label: {
                            Text("")
                        }))