如何以编程方式触发 NavigationLink?

Posted

技术标签:

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

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

【问题讨论】:

这是您要找的吗?:***.com/a/56858112/7786555 您找到解决方案了吗?我找不到选择新行并显示详细信息的方法。 我的解决方案有效吗? 【参考方案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

【讨论】:

以上是关于如何以编程方式触发 NavigationLink?的主要内容,如果未能解决你的问题,请参考以下文章

当按钮靠在一起时,SwiftUI NavigationLink 行为不正确

如何以编程方式触发方法“tabBarController:didSelectViewController:”?

如何以编程方式触发 ngClick

如何以编程方式触发 UIView 的点击手势识别器

以编程方式点击状态栏后如何触发“scrollsToTop”?

SwiftUI NavigationLink 弹出