【问题标题】:How to programmatically trigger NavigationLink?如何以编程方式触发 NavigationLink?
【发布时间】:2019-07-29 03:39:11
【问题描述】:

我有一个带有一堆 NavigationLink 的 NavigationView。当用户点击“添加”按钮时,我想在视图中创建一个新项目并自动将它们发送给它。我可以这样做吗?

【问题讨论】:

  • 这是您要找的吗?:stackoverflow.com/a/56858112/7786555
  • 您找到解决方案了吗?我找不到选择新行并显示详细信息的方法。
  • 我的解决方案有效吗?

标签: swiftui


【解决方案1】:

SwiftUI 触发 View 更改(body)当其真实来源发生变化时,因此您只需更改 Binding<Bool> 值即可触发视图更新。存储每个链接的绑定,并在您单击按钮时更改其值。

假设您要推送三个不同的视图。然后,您将存储三个不同的绑定。您可以将这些绑定存储为三个单独的 @State 属性,或使用 @StateObject 视图模型,如下所示:

class RootViewModel: ObservableObject {
  @Published var isLinkActive:[Int: Bool] = [:]
}

struct RootView: View {
  @StateObject var viewModel = RootViewModel()
  ...
  func binding(index: Int) -> Binding<Bool> {
    return .init(get: { () -> Bool in
      return self.viewModel.isLinkActive[index, default: false]
    }) { (value) in
      self.viewModel.isLinkActive[index] = value
    }
  }
  ...
  func destination(index: Int) -> some View {
    switch index {
      case 1:
        return ContentViewOne()
      case 2:
        return ContentViewTwo()
      case 3:
        return ContentViewThree()
      default:
        return EmptyView()
    }
  }
  
  var body: some View {
    return
      NavigationView {
        VStack {
          ForEach(1..<4) { index in
            NavigationLink(destination: self.destination(index: index), isActive: self.binding(index: index)) {
              Text("Link to Content View \(index)")
            }
          }
          Button("Add") {
            self.contentViewModel.isLinkActive[2] = true // Change this index depending on which view you want to push.
          }
        }
      }
  }
}

所以这里的按钮模拟了第二次NavigationLink 点击。我使用StateObject 停止在推送过程中重绘整个RootView

【讨论】:

    猜你喜欢
    • 2020-07-02
    • 1970-01-01
    • 2017-07-15
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 2010-12-16
    相关资源
    最近更新 更多