我有一个 ObservedObject AppStatus 类,它内部有多个 Published 类。如果我只在孩子方面有水平,一切都会很好。
当我有一个 RecordingTimeManager 类,其中有另一个变量(2 级子级)时,问题就出现了。当我按下按钮时,变量 maxRecordingTime 正在正确更改,它会打印“15 15Seconds”,但 foregroundColor 不会触发更改。我不确定这是否是 SwiftUI 错误,或者我应该以另一种方式构建关系:
// 应用程序状态
// Recording
@Published var recordingTimeManager: RecordingTimeManager = RecordingTimeManager()
// 录音时间管理器
class RecordingTimeManager {
@Published var maxRecordingTime: TimeSeletedTime = .sixteenSeconds
...
// 需要根据 maxRecordingTime 更改更改不透明度的 SwiftUI 组件(.foregroundColor 未更改)
Button {
appStatus.recordingTimeManager.maxRecordingTime = .fifteenSeconds
print("15 \(appStatus.recordingTimeManager.maxRecordingTime)")
} label: {
Text("15")
.font(Font.custom("BwGradual-Bold", size: 15))
.foregroundColor(appStatus.recordingTimeManager.maxRecordingTime == .fifteenSeconds ? CLAPSOFFWHITE : TRIBESGREY)
}
非常感谢,
可观察对象不仅仅在具有多个级别的类时才起作用。这@Published
属性包装器在属性发生更改时通知视图,但因为该属性是class
- 引用类型 - 当您更改其属性之一时,它实际上不会更改。换句话说,引用保持不变。
还有内在@Published
不做任何事情,因为没有任何东西直接观察它(即使RecordingTimeManager
符合ObservableObject
)
所以,你要么需要做RecordingTimeManager
值类型 - astruct
:
struct RecordingTimeManager {
var maxRecordingTime: TimeSeletedTime = .sixteenSeconds
}
或者,如果它必须是class
(也许因为它有一些内部状态和生命周期),那么您可以创建一个直接观察它的内部视图。
首先,它需要是一个ObservableObject
:
class RecordingTimeManager: ObservableObject {
@Published var maxRecordingTime: TimeSeletedTime = .sixteenSeconds
然后创建一个观察它的视图(可以是私有内部视图):
struct MainView: View {
@StateObject var appStatus: AppStatus = .init()
private struct InnerView: View {
@ObservedObject var recordingManager: RecordingTimeManager
var body: some View {
Button {
recordingManager.maxRecordingTime = .fifteenSeconds
} label: {
Text("15")
.font(Font.custom("BwGradual-Bold", size: 15))
.foregroundColor(
recordingManager.maxRecordingTime == .fifteenSeconds
? CLAPSOFFWHITE : TRIBESGREY)
}
}
}
var body: some View {
InnerView(recordingManager: appStatus.recordingTimeManager)
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)