【问题标题】:SwiftUI ToolbarItem doesn't present a View from a NavigationLinkSwiftUI ToolbarItem 不显示来自 NavigationLink 的视图
【发布时间】:2020-12-15 12:39:09
【问题描述】:

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

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

【问题讨论】:

    标签: swiftui


    【解决方案1】:

    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! :),就像一个魅力!
    • 它确实有效,但我不知道它是如何运作的:D
    【解决方案2】:

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

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

    【讨论】:

    • 嗯,这很奇怪。
    • 这真是不寻常但纯粹的天才。你是怎么想出这个解决方案的?另外,您认为这在未来的 Swift 版本中继续使用的可能性有多大?
    • 从 ios15 开始,这仍然有效
    【解决方案3】:

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

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

    解决方法是将 NavigationLink 不放在 View 中,而是放在 navigationBarItems 中,例如:

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

    【讨论】:

    • 对于使用 Xcode 12.2 的我来说,我发现您和 @asperi 的方法成功地显示了目的地,但只有使用 asperi 时,目的地才会弹回该视图。也许是我的代码的次要问题,但我也更喜欢使用较新的 ToolbarItem
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 2021-04-01
    • 1970-01-01
    • 2021-01-12
    • 2020-01-16
    相关资源
    最近更新 更多