ObservableObject 不更新视图

Posted

技术标签:

【中文标题】ObservableObject 不更新视图【英文标题】:ObservableObject not updating View 【发布时间】:2020-12-14 22:36:03 【问题描述】:

我创建了一个 Atmeter 作为 ObservableObject,以便我可以从我的应用程序中的多个点访问它。不幸的是,当@Published 变量压力发生变化时,视图没有更新。谁能解释一下原因?

我已经尝试过 willSet objectWillChange.send() ,它会触发但也不会更新视图!

高度计:

//
//  Altimeter.swift
//  iAlti_v2
//
//  Created by Lukas Wheldon on 14.12.20.
//

import Foundation
import CoreMotion
import Combine

class Altimeter: CMAltimeter, ObservableObject 
    static let shared = Altimeter()
    
    @Published var pressure: Double = 0
    
    func start() 
        if Altimeter.isRelativeAltitudeAvailable() 
            switch Altimeter.authorizationStatus() 
            case .notDetermined: // Handle state before user prompt
                debugPrint("CM: Awaiting user prompt...")
            //fatalError("Awaiting CM user prompt...")
            case .restricted: // Handle system-wide restriction
                fatalError("CM Authorization restricted!")
            case .denied: // Handle user denied state
                fatalError("CM Authorization denied!")
            case .authorized: // Ready to go!
                debugPrint("CM Authorized!")
            @unknown default:
                fatalError("Unknown CM Authorization Status!")
            
            Altimeter.shared.startRelativeAltitudeUpdates(to: OperationQueue.main)  data, error in
                if let trueData = data 
                    //debugPrint(#function, trueData)
                    Altimeter.shared.pressure = trueData.pressure.doubleValue * 10
                 else 
                    debugPrint("Error starting relative Altitude Updates: \(error?.localizedDescription ?? "Unknown Error")")
                
            
        
    

观点:

import SwiftUI

struct SwiftUIView: View 
    var body: some View 
        Text("\(Altimeter.shared.pressure)")
    


【问题讨论】:

【参考方案1】:

您需要在 SwiftUIView 中使用 @ObservedObject 包装器。

不要只调用文本中的对象。

【讨论】:

我还在视图中尝试了@ObservedObject altimeter = Altimeter(),但这也不起作用!而且我不应该创建一个单例实例,对吧?【参考方案2】:

这解决了我的问题:

@ObservedObject private var altimeter = Altimeter.shared

【讨论】:

以上是关于ObservableObject 不更新视图的主要内容,如果未能解决你的问题,请参考以下文章

Swiftui:子视图没有收到对 observableobject 的更新

重新加载数据但 ObservableObject 不工作

UITextField 未更新以更改 ObservableObject (SwiftUI)

如何使用 ObservableObject 更新 UIViewRepresentable

SwiftUI 视图更新

如何告诉 SwiftUI 视图绑定到多个嵌套的 ObservableObject