如何以编程方式触发NavigationLink?

时间:2019-07-29 03:39:11

标签: swiftui

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

1 个答案:

答案 0 :(得分: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