swift - SwiftUI 中的计算(NSObject)属性不会更新视图
问题描述
所以,我想要一个Text
根据我的 CoreData 模型的内容来改变它的内容。为此,我在 Xcode beta 4 中使用了一个计算属性,但它似乎不再起作用了。这是一个错误还是我没有看到其他问题?
self.objectWillChange.send()
我遇到的问题是我的视图(和计算的属性)在我的商店中调用时似乎没有得到更新。
我还尝试将我的 var '导出'到商店并从那里获取它,结果相同......
编辑:
我只是对另一个类进行了同样的尝试,但它并不能仅objectWillChange.send()
用于但仅与@Published
它一起工作,如果从 NSObject 继承的类即使停止工作...
我刚刚发现:与
struct Today: View {
@EnvironmentObject var myStore: DateStore
var hasPlans: Bool {
guard let plans = myStore.getPlans() else { return false }
return plans.isEmpty
}
var body: some View{
VStack{
Text(hasPlans ? "I have plans":"I have time today")
Button(action: {
self.myStore.addPlans(for: Date())
}) {
Text("I have plans")
}
}
}
class DateStore: NSObject, ObservableObject, NSFetchedResultsControllerDelegate {
private var fetchedResultsController: NSFetchedResultsController<DateStore>
//...
public func addPlans(for date: Date){
//{...}
if let day = self.dates.first(where: { $0.date == date}){
day.plans += 1
saveChanges()
}else{
self.create(date: dayDate)
}
}
func controllerDidChangeContent(_ controller: NSFetchedResultsController<NSFetchRequestResult>) {
self.objectWillChange.send()
}
}
这是我的问题的一个非常简化的版本,我知道我的 DataModel 工作是因为值发生了变化并被self.objectWillChange.send()
调用,但我的视图由于某种原因没有更新......
解决方案
我不认为 NSObject 是问题的根源。问题似乎是你还没有实现objectWillChange
. 编译器会让你侥幸逃脱,但结果是你objectWillChange
什么都不做。
这是一个简单的示例,展示了如何使用绑定有效的计算属性配置 ObservableObject(即 NSObject):
class Thing : NSObject, ObservableObject {
let objectWillChange = ObservableObjectPublisher()
var computedProperty : Bool = true {
willSet {
self.objectWillChange.send()
}
}
}
struct ContentView: View {
@EnvironmentObject var thing : Thing
var body: some View {
VStack {
Button(self.thing.computedProperty ? "Hello" : "Goodbye") {
self.thing.computedProperty.toggle()
}
Toggle.init("", isOn: self.$thing.computedProperty).frame(width:0)
}
}
}
您可以通过点击按钮和开关来查看所有内容都是实时的并且响应视图中的绑定。
推荐阅读
- javascript - JSX 元素类型“Line”不是 JSX 元素的构造函数
- android - 如何从 initstate 中删除小部件或仅在 initstate 中加载小部件小部件一次?
- google-cloud-platform - RuntimeError:构建自定义图像时出错
- python - 如何在 python 脚本中保护纯文本密码
- jquery - 如何使用 settimeout 在 jquery 中制作 Preloader?
- python - 在 KMeans 算法中获取每个集群中的值的数量
- c# - Outlook VSTO 收件人 MeetingResponseStatus 在接受会议后未更新
- java - 如何在java的I/O流中转换c++的freopen
- rank - 如何计算召回@k
- ios - 如何在警报中允许位置权限时显示 TableViewController?