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
                    }
                }
        }
    }
}

谢谢!

好吧,我找到了一个不太阴暗的解决方案。我用这篇文章 https://ryanashcraft.me/swiftui-programmatic-navigation 向他大喊大叫!我没有使用NavigationLink按钮,而是使用常规按钮,当用户点击时保存所选项目,然后使用NavigationDestinationLink按原样推送新视图self.link.presented?.value = true

从测试版 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)
                    }
                }
            }
        }
    }
}

您可以添加简单的点击手势

                NavigationLink(destination: ContentView() ) {
                    Text("Row")
                        .gesture(TapGesture()
                            .onEnded({ _ in
                                //your action here
                    }))
                }

这也可以通过在任何 View 继承器中使用发布服务器和OnReceive钩来实现。

Swift 5.1

如果您想将其应用于静态列表。你可以试试这个。

NavigationView{
        List{
            NavigationLink("YourView1Description", destination: YourView1())
            NavigationLink("YourView2Description", destination: YourView2())
           NavigationLink("YourView3Description", destination: YourView3())
           NavigationLink("YourView4Description", destination: YourView4())
        }
        .navigationBarTitle(Text("Details"))
    }

相关内容

  • 没有找到相关文章

最新更新