SwiftUI-从Swift类启动的可观察对象不更新ContentView()上的@ObservedObject
正在从ContentView()和另一个Swift类实例化ObserveObject类。当ObserveObject类的函数由Swift类运行时,它不会更新ContentView()的@ObserveObject 我知道这是因为我实例化了ObserveObject类两次。当ContentView()未实例化/无法实例化可观察类时,使用@ObservedObject的最佳实践是什么 我还没有找到让@EnvironmentObject与Swift类一起工作的方法。SwiftUI-从Swift类启动的可观察对象不更新ContentView()上的@ObservedObject,swift,swiftui,observableobject,environmentobject,Swift,Swiftui,Observableobject,Environmentobject,正在从ContentView()和另一个Swift类实例化ObserveObject类。当ObserveObject类的函数由Swift类运行时,它不会更新ContentView()的@ObserveObject 我知道这是因为我实例化了ObserveObject类两次。当ContentView()未实例化/无法实例化可观察类时,使用@ObservedObject的最佳实践是什么 我还没有找到让@EnvironmentObject与Swift类一起工作的方法。 我可以使用一个全局变量并运行Tim
我可以使用一个全局变量并运行Timer()来检查对它的更改。然而,这感觉像是一种丑陋的方式吗 请参阅下面的示例代码。请在设备上运行,以查看打印语句
import SwiftUI
struct ContentView: View {
@ObservedObject var observedClass: ObservedClass = ObservedClass()
// The callingObservedClass does not exist on the ContentView, but is called
// somewhere in the app with no reference to the ContentView.
// It is included here to better showcase the issue.
let callingObservedClass: CallingObservedClass = CallingObservedClass()
var body: some View {
VStack {
// This Text shall be updated, when
// self.callingObservedClass.increaseObservedClassCount() has been executed.
Text(String(observedClass.count))
Button(action: {
// This updates the count-variable, but as callingObservedClass creates
// a new instance of ObservedClass, the Text(observedClass.count) is not updated.
self.callingObservedClass.increaseObservedClassCount()
}, label: {
Text("Increase")
})
}
}
}
class CallingObservedClass {
let observedClass = ObservedClass()
func increaseObservedClassCount() {
// Returning an Int here to better showcase that count is increased.
// But not in the ObservedClass instance of the ContentView, as the
// Text(observedClass.count) remains at 0.
let printCount = observedClass.increaseCount()
print(printCount)
}
}
class ObservedClass: ObservableObject {
@Published var count: Int = 0
func increaseCount() -> Int {
count = count + 1
return count
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
编辑:我想我的问题是,当我无法从SwiftUI视图实例化Swift类时,如何从Swift类获取数据并在数据更改时更新SwiftUI视图。一个可能的解决方案是链接ObservableObject类。不幸的是,从iOS 13.6开始,这并不是现成的 我通过以下途径找到了答案: 调整和运行示例:
// Add Combine
import Combine
import SwiftUI
struct ContentView: View {
@ObservedObject var callingObservedClass: CallingObservedClass = CallingObservedClass()
var body: some View {
VStack {
// Calling the chained ObservableObject
Text(String(callingObservedClass.observedClass.count))
Button(action: {
self.callingObservedClass.increaseObservedClassCount()
}, label: {
Text("Increase")
})
}
}
}
class CallingObservedClass: ObservableObject {
// Chaining Observable Objects
@Published var observedClass = ObservedClass()
// ObservableObject-chaining does not work out of the box.
// The anyCancellable variable with the below init() will do the trick.
// Thanks to https://stackoverflow.com/questions/58406287/how-to-tell-swiftui-views-to-bind-to-nested-observableobjects
var anyCancellable: AnyCancellable? = nil
init() {
anyCancellable = observedClass.objectWillChange.sink { (_) in
self.objectWillChange.send()
}
}
func increaseObservedClassCount() {
let printCount = observedClass.increaseCount()
print(printCount)
}
}
class ObservedClass: ObservableObject {
@Published var count: Int = 0
func increaseCount() -> Int {
count = count + 1
return count
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
如果observeObject链接不是一个选项,我对如何访问Swift类数据和更新SwiftUI视图感兴趣
如果您对此有解决方案,请回答以下问题