修改EnvironmentObject字符串后视图未更新文本

问题描述 投票:0回答:1

我有一个名为IndepthView的主类

struct InDepthView: View {
    @EnvironmentObject var globalData: GlobalData

    var body: some View {
        Button(action: { self.showList.toggle() }) {
            VStack(alignment: .leading) {
                HStack {
                    Text("\(self.globalData.whichCountry.uppercased())")
                        .font(.system(size: 20)).bold()
                    }
                }
         }
         .sheet(isPresented: $showList) {
             ListOfCountriesView().environmentObject(GlobalData())
         }
    }
}

这是我的课程,其中包含要在视图之间传递的数据

import Foundation

class GlobalData: ObservableObject {

    @Published var whichCountry: String = "italy"
}

这是我用来更改其他国家/地区文字的模式表

import SwiftUI

struct ListOfCountriesView: View {

    @EnvironmentObject var globalData: GlobalData

    var body: some View {
        VStack {
            Text("List of Countries")

            Button(action: {
                self.globalData.whichCountry = "usa"
                print(self.globalData.whichCountry)
            }) {
                Text("USA")
            }
        }
    }
}

正在更新“ whichCountry”的数据,因为我添加了打印语句以查看其是否被修改。但是主视图类(IndepthView)不会更新文本,而只会显示“意大利”。单击按钮(“美国”)并显示“美国”后,应该对其进行更新。我已确保eninvromentObject正确传递。让我知道是否需要更多说明或信息。

另外,为什么这在我的updateData()方法中总是崩溃。它说找不到“致命错误:找不到类型为GlobalData的ObservableObject。”]

class getDepthData: ObservableObject {

    @Published var data : Specific!

    @EnvironmentObject var globalData: GlobalData

    init() {
        updateData()
    }

    func updateData() {

        let url = "https://corona.lmao.ninja/v2/countries/" // specific country

        let session = URLSession(configuration: .default)

        session.dataTask(with: URL(string: url+"\(self.globalData.whichCountry)")!) { (data, _, err) in

            if err != nil {
                print((err?.localizedDescription)!)
                return
            }

            let json = try! JSONDecoder().decode(Specific.self, from: data!)

            DispatchQueue.main.async {
                self.data = json
            }

        }.resume()
    }
}
swift object observable swiftui environment
1个回答
0
投票

您必须传递自己的全局数据引用,而不是创建新实例。请参见下面的内联。

struct InDepthView: View {
    @EnvironmentObject var globalData: GlobalData

    var body: some View {
        Button(action: { self.showList.toggle() }) {
            VStack(alignment: .leading) {
                HStack {
                    Text("\(self.globalData.whichCountry.uppercased())")
                        .font(.system(size: 20)).bold()
                    }
                }
         }
         .sheet(isPresented: $showList) {
             ListOfCountriesView().environmentObject(self.globalData) // << fix !!
         }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.