ObservableObject 不更新视图
ObservableObject not updating View
我创建了一个 Atimeter 作为 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)")
}
}
您需要在 SwiftUIView 中使用 @ObservedObject 包装器。
不要只调用文本中的对象。
这解决了我的问题:
@ObservedObject private var altimeter = Altimeter.shared
我创建了一个 Atimeter 作为 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)")
}
}
您需要在 SwiftUIView 中使用 @ObservedObject 包装器。
不要只调用文本中的对象。
这解决了我的问题:
@ObservedObject private var altimeter = Altimeter.shared