无法在视图之间传递数据,也无法在第二个视图中更新-SwiftUI

问题描述

我试图在this article之后使用@Published@Observedobject在2个视图之间传递数据,但是由于某些原因,我无法传递数据,@Published一直保持在初始状态下,它是给定的,而不是在单击按钮时更改。

一个视图ProductList2导航到一个tabView,我试图将数据传递到其中一个tabViews。任何帮助将不胜感激。

这是我在其中创建ObservableObject@Published

的视图
class selectedApplication: ObservableObject {
    @Published var selectedApplication = "All"
}

struct ProductList2: View {
    @Observedobject var selectedOption = selectedApplication()
    var products: [ProductModel] = productData
    
    var body: some View {
        vstack {
            HStack {
                List{
                    ForEach(applicationsArray,id: \.self) { item in
                        Button(action: {
                            self.selectedOption.selectedApplication = item
                        }) {
                            HStack(){
                                Image(item)
                                Text(item)
                            }
                        }
                    }
                }
            }
            List{
                let matchedItems = products.filter {
                    product in
                    let list = product.application
                    for item in list {
                        if item == selectedOption.selectedApplication {
                            return true
                        }
                    }
                    return false
                }
                ForEach(matchedItems) { item in
                    NavigationLink(destination: ProductTabView(product: item)) {
                        ProductListRow(product: item)
                    }
                }
            }
        }
    }
}

这是我试图在其中检索数据的tabview视图:

struct ProductTab5View: View {
    var product: ProductModel
    @Observedobject private var application = selectedApplication()
    
    var body: some View {
        vstack(alignment: .leading){
            Text(product.detailTabNames[3])
            ScrollView(.horizontal,showsIndicators: false) {
                HStack(alignment: .center,spacing: 0){
                    ForEach(product.application,id: \.self) { item in
                            Button(action: {
                                application.selectedApplication = item
                            }) {
                                vstack {
                                    Image(item)
                                    Text(item)
                                }
                            }
                    }
                }
            }            
            vstack(alignment: .center){
                Text(application.selectedApplication)
            }
        } 
    }
}

编辑:

我已经更新了导航链接@Observedobject,但仍然无法使它工作:

这是更新的ProductList2 NavigationLink:

ForEach(matchedItems) { item in
                        NavigationLink(destination: ProductTabView(product: item,application: selectedOption.selectedApplication)){
                            ProductListRow(product: item)
                        }
                    }

这是ProductTab5View上的@Observedobject,我也无法预览:

@Observedobject private var application: selectedApplication

struct ProductTab5View_Previews: PreviewProvider {
    static var previews: some View {
        ProductTab5View(product: productData[0],application: application)
    }
}

解决方法

您正在使用selectedApplication的两个不同实例:

struct ProductList2: View {
    @ObservedObject var selectedOption = selectedApplication()
struct ProductTab5View: View {
    ...
    @ObservedObject private var application = selectedApplication()

您需要在两个视图中使用相同的实例。

struct ProductTab5View: View {
    ...
    @ObservedObject var application: selectedApplication // declare only
// pass the already created instance to the child view
NavigationLink(destination: ProductTabView(product: item,application: selectedOption))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...