如何以编程方式触发 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:”?