SwiftUI 工具栏项目无法从 NavigationLink 中呈现视图

14

我不知道这是一个错误还是我在这里做错了什么。我已经在导航栏上添加了一个新的按钮,它会呈现一个新的视图。

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(beta 6)和Xcode 12(beta 6)上进行测试。据我所知,导航链接在列表中呈现新视图很好,但在工具栏中,如所示,情况并非如此。工具栏上的按钮可见且活动状态,但不会触发显示新视图。

3个回答

24

我发现在HStack中使用一个空文本作为第一个元素也可以起到作用,它使得navigationLink能够正确运作。

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

3
好的,那很奇怪。 - Ian Warburton
1
这真的很不寻常,但纯粹是天才。你是怎么想出这个解决方案的?另外,你认为这个方案在未来的Swift版本中继续工作的机会有多大? - FontFamily
截至iOS 15,这仍然有效。 - Daryl Wong

22
NavigationView

你应该把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
        }
      }
    }
  }
}

哇,我不知道那个,真是太有帮助了,而且速度很快。谢谢@Asperi!:),非常好用! - javierdemartin
它确实起作用,但我不知道它是如何工作的:D - zahid shabbir

1
使用Asperi解决方案可能无法正常工作,如果您的导航链接指向一个需要键盘输入的视图。
在导航链接后,新视图中的工具栏加载正确,但当使用键盘进行输入并关闭键盘时,所有工具栏项都会消失。
解决方案是将NavigationLink放置在navigationBarItems而不是View中,例如:
.navigationBarItems(
                leading:
                    NavigationLink(
                        destination: Creator(),
                        isActive: $showCreator,
                        label: {
                            Text("")
                        }))

2
对于我使用的Xcode 12.2,我发现你和@asperi的方法成功地显示了目标,但只有使用asperi的方法才能让目标弹回到这个视图。也许这是我的代码的次要问题,但我更喜欢使用更新的ToolbarItem。 - Collierton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接