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