SwiftUI - 环境对象未更新 UI

Posted

技术标签:

【中文标题】SwiftUI - 环境对象未更新 UI【英文标题】:SwiftUI - Environment Object Not Updating UI 【发布时间】:2019-11-12 15:58:07 【问题描述】:

我的应用有一个按钮,可以生成绿色或红色背景。用户一次又一次地按下按钮以生成绿色或红色,并将结果记录到一个名为“当前会话”的可观察对象中。当前总数显示在由胶囊组成的自定义视图中。由于某种原因,视图不会更新总数并一直显示 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)。

【问题讨论】:

你能显示按钮的代码吗? @Chris 除了一个 buttonPressed 函数调用该函数生成绿色或红色,并设置一个计时器以禁用该按钮五秒钟(所有这些都可以正常工作)之外,实际上什么都没有。 【参考方案1】:

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

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

    var body: some View 
        ResultsView()
            .environmentObject(session)
            .onTapGesture 
                self.session.generateGreenOrRed()
            
    

【讨论】:

这导致我解决了问题!这不是你说的,它实际上是关于使用 EnvironmentObject 包装器。我到处都将它更改为 ObservedObject,并将环境对象添加到视图主体的末尾,现在它可以工作了。感谢您将我推向正确的方向。 ios 14 中这个解决方案会破坏应用程序,不要这样做!!!

以上是关于SwiftUI - 环境对象未更新 UI的主要内容,如果未能解决你的问题,请参考以下文章

已发布/观察到的 var 在视图 swiftui 中未更新,带有调用函数

如何减少我的 SwiftUI ViewBuilder 布局?

环境大小类未更新

SwiftUI,为啥部分视图没有刷新? @State 变量未更新

SwiftUI 已发布更新不刷新

SwiftUI 中子结构的计算属性未更新