无法从类中更新已发布的变量

  • 本文关键字:变量 更新 swift swiftui
  • 更新时间 :
  • 英文 :


我有一个已发布的varprediction:

class TrainingStatus: ObservableObject {
@Published var isTrained: Bool = false
@Published var modelUrl: URL = URL(fileURLWithPath: "hello")
@Published var prediction:String = ""
}

我尝试在类中更新这个变量:

class ClassificationController: ObservableObject {
...
func processObservations(for request: VNRequest, error: Error?) {
DispatchQueue.main.async {
if let results = request.results as? [VNClassificationObservation] {
if results.isEmpty {
print("nothing found")
} else {
print("got a result: (results)!")
let top3 = results.prefix(3).map { observation in
String(format: "%@ %.1f%%", observation.identifier, observation.confidence * 100)
}
self.prediction = top3.joined(separator: " ")

// attempt to set environment variable?
let trainingStatus = TrainingStatus()
trainingStatus.prediction = self.prediction

print("set prediction: (trainingStatus.prediction)")
}
}

在我的UIView中显示这个变量:

struct SidebarView: View {

@EnvironmentObject var trainingStatus: TrainingStatus


var body: some View {
VStack{
NavigationView{
Section{
Text("Trained? " + String(trainingStatus.isTrained))
Text("Prediction: (trainingStatus.prediction)")
}

}
.navigationTitle("Data")
}
.environmentObject(modelData)
.environmentObject(trainingStatus)
}
}
}

但是,虽然看起来prediction值在ClassificationController中得到更新,但我的UI视图与文本(trainingStatus.prediction)从未得到更新。

我如何更新我的视图来获取最新发布的值?

你可以有效地(几乎)利用一个单例。

你首先需要改变你的ObservableObject类,并添加一个新的常量:

class TrainingStatus: ObservableObject {
@Published var isTrained: Bool = false
@Published var modelUrl: URL = URL(fileURLWithPath: "hello")
@Published var prediction:String = ""
public static let shared = TrainingStatus()
}

那么你可以通过声明下面的语句在其他地方访问它:

var trainingStatus = TrainingStatus.shared

现在你可以随意修改它的值。这也会在ObservableObject类中更新它,因此在任何其他视图中使用它都可以更改它。

用例示例:

struct SidebarView: View {

var trainingStatus = TrainingStatus.shared


var body: some View {
VStack{
NavigationView{
Section{
Text("Trained? " + String(trainingStatus.isTrained))
Text("Prediction: (trainingStatus.prediction)") //This is now referencing your new shared variable of trainingStatus
}

}
.navigationTitle("Data")
}
.environmentObject(modelData)
.environmentObject(trainingStatus)
}
}
}

要修改常量的类:

class ClassificationController: ObservableObject {

var trainingStatus = TrainingStatus.shared
...
func processObservations(for request: VNRequest, error: Error?) {
DispatchQueue.main.async {
if let results = request.results as? [VNClassificationObservation] {
if results.isEmpty {
print("nothing found")
} else {
print("got a result: (results)!")
let top3 = results.prefix(3).map { observation in
String(format: "%@ %.1f%%", observation.identifier, observation.confidence * 100)
}
self.prediction = top3.joined(separator: " ")

// attempt to set environment variable?
//let trainingStatus = TrainingStatus() --- no longer need this line
trainingStatus.prediction = self.prediction //this is now changing your singleton

print("set prediction: (trainingStatus.prediction)")
}
}

最新更新