SwiftUI:在推送另一个视图之前,如何获取列表中的选定行

时间:2019-07-16 13:18:25

标签: ios swift swiftui

另一个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
                    }
                }
        }
    }
}

谢谢!

4 个答案:

答案 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
                    }))
                }