gpt4 book ai didi

SwiftUI 更改多级子对象已发布的对象更改

转载 作者:行者123 更新时间:2023-12-05 09:05:14 26 4
gpt4 key购买 nike

我有一个 ObservedObject AppStatus 类,它本身有多个 Published 类。如果我只有 child 方面的水平,一切都很好。

当我有一个类 RecordingTimeManager 里面有另一个变量(2 级子级)时,问题就来了。当我按下按钮时,变量 maxRecordingTime 正在正确更改,它打印“15 fifteentSeconds”,但 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)
}

非常感谢,

最佳答案

Observable 对象不仅仅在您有多个级别的类时起作用。 @Published 属性包装器会在属性更改时通知 View ,但是因为此属性是一个 class - 一种引用类型 - 当您更改它时它实际上并没有更改它的属性。换句话说,引用保持不变。

并且内部 @Published 不做任何事情,因为没有任何东西直接观察它(即使 RecordingTimeManager 符合 ObservableObject)

因此,您需要将 RecordingTimeManager 设为值类型 - struct:

struct RecordingTimeManager {
var maxRecordingTime: TimeSeletedTime = .sixteenSeconds
}

或者,如果它必须是一个(可能是因为它有一些内部状态和生命周期),那么您可以创建一个直接观察它的内部 View 。

首先,它需要是一个ObservableObject:

class RecordingTimeManager: ObservableObject {
@Published var maxRecordingTime: TimeSeletedTime = .sixteenSeconds

然后创建一个观察它的 View (可以是私有(private)内部 View ):

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)
}
}

关于SwiftUI 更改多级子对象已发布的对象更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67458336/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com