SwiftUI-环境对象未更新UI

我的应用程序有一个按钮,该按钮产生绿色或红色背景。用户每次反复按下按钮以生成绿色或红色,并将结果记录到称为“当前会话”的可观察对象中。当前总数显示在由胶囊制成的自定义视图中。由于某种原因,该视图将不会更新总数,并始终显示0。

我尝试在ResultsBar中为numberOfGreens添加状态绑定,但这也不起作用。每次仍然显示0。该环境已添加到我的所有视图中。我尝试打印结果,结果编号在控制台中显示正确,但是UI不会更新。有趣的是,trialsRemaining变量可以在我的应用程序的其他屏幕上完美运行,并且在需要更新时不会遇到麻烦。另外,ResultsBar在预览中也可以很好地工作。

class CurrentSession: ObservableObject {

  @Published var trialsRemaining: Int = 100
  @Published var numberOfGreens: Int = 0
  @Published var numberOfReds: Int = 0

  func generateGreenOrRed() {
    ...
    if resultIsGreen {numberOfGreens += 1}
    else if resultIsRed {numberOfReds += 1}
    trialsRemaining -= 1
  }
}
struct ResultsBar: View {
  let totalBarWidth: CGFloat = UIScreen.main.bounds.width - 48
  var onePercentOfTotalWidth: CGFloat { return totalBarWidth/100 }
  var numberOfGreens: Int

  var body: some View {
    ZStack(alignment: .leading) {       
      Capsule()
        .frame(width: totalBarWidth,height: 36)
        .foregroundColor(.red)
        .shadow(radius: 4)   
      Capsule()
        .frame(width: (onePercentOfTotalWidth * CGFloat(numberOfGreens)),height: 36)
        .foregroundColor(.green)
        .shadow(radius: 4)   
    }
  }
}
struct ResultsView: View {

  @EnvironmentObject var session: CurrentSession

  var body: some View {
    VStack {       
      HStack {
        Text("\(session.numberOfGreens)")
        Spacer()
        Text("\(session.numberOfReds)")       
      }

      ResultsBar(numberOfGreens: session.numberOfGreens)
    }
  }
}

我正在macOS Catalina 10.15.2 Beta(19C32e)上运行Xcode 11.2 beta 2(11B44)。

zwx917 回答:SwiftUI-环境对象未更新UI

您是否将对CurrentSession实例的引用传递给ResultsView?如果我复制您的代码,则当单击ResultsBar时,以下内容会更新。

struct ContentView: View {
    @ObservedObject var session = CurrentSession()

    var body: some View {
        ResultsView()
            .environmentObject(session)
            .onTapGesture {
                self.session.generateGreenOrRed()
            }
    }
}
本文链接:https://www.f2er.com/3116021.html

大家都在问