另一个SwiftUI挣扎!
我有一个包含列表的视图。当用户点击一行时,我想先将所选项目保存在我的VM中,然后再推送另一个视图。 我能想到的解决该问题的唯一方法是,首先保存选定的行,然后使用另一个按钮来推送下一个视图。似乎只用一次点击就不可能做到这一点。
有人知道吗?
下面是代码:
struct AnotherView : View {
@State var viewModel = AnotherViewModel()
var body: some View {
NavigationView {
VStack {
List(viewModel.items.identified(by: \.id)) { item in
NavigationLink(destination: DestinationView()) {
Text(item)
}
// Before the new view is open, I want to save the selected item in my VM, which will write to a global store.
self.viewModel.selectedItem = item
}
}
}
}
}
谢谢!
答案 0 :(得分:3)
好的,我找到了一个不太阴的解决方案。
我用这篇https://ryanashcraft.me/swiftui-programmatic-navigation枪杀了他!
我使用常规按钮,而不是使用NavigationLink
按钮,而是在用户点击时保存所选项目,然后使用NavigationDestinationLink
按原样self.link.presented?.value = true
推送新视图。
像beta 3一样具有魅力! 如果下一个测试版中发生更改,我将更新我的帖子。
这是它的样子:
struct AnotherView : View {
private let link: NavigationDestinationLink<AnotherView2>
@State var viewModel = AnotherViewModel()
init() {
self.link = NavigationDestinationLink(
AnotherView2(),
isDetail: true
)
}
var body: some View {
NavigationView {
VStack {
List(viewModel.items.identified(by: \.id)) { item in
Button(action: {
// Save the object into a global store to be used later on
self.viewModel.selectedItem = item
// Present new view
self.link.presented?.value = true
}) {
Text(value: item)
}
}
}
}
}
}
答案 1 :(得分:1)
Swift 5.1
如果您想将其应用于静态列表。您可以尝试一下。
NavigationView{
List{
NavigationLink("YourView1Description", destination: YourView1())
NavigationLink("YourView2Description", destination: YourView2())
NavigationLink("YourView3Description", destination: YourView3())
NavigationLink("YourView4Description", destination: YourView4())
}
.navigationBarTitle(Text("Details"))
}
答案 2 :(得分:0)
这也可以通过在任何View继承程序中使用Publisher和def turingMachine(list, number2):
temp = list[1]
temp2 = list[number2]
try:
temp = int(temp)
temp2 = int(temp2)
sum_ = temp + temp2
list[1] = sum_
list[number2] = 0
except:
print("error: cannot convert " + str(temp) + " or " + str(temp2) + " to int")
挂钩来完成。
答案 3 :(得分:0)
您可以添加简单的TapGesture
NavigationLink(destination: ContentView() ) {
Text("Row")
.gesture(TapGesture()
.onEnded({ _ in
//your action here
}))
}