SwiftUI:为啥 ObservedObject 在 AppDelegate 中不起作用?
Posted
技术标签:
【中文标题】SwiftUI:为啥 ObservedObject 在 AppDelegate 中不起作用?【英文标题】:SwiftUI: Why doesn't ObservedObject work in AppDelegate?SwiftUI:为什么 ObservedObject 在 AppDelegate 中不起作用? 【发布时间】:2019-10-17 08:54:07 【问题描述】:我已经尝试了ObservableObject documentation 中的示例。
class Contact: ObservableObject
@Published var name: String = "me"
@Published var age: Int = 7
当我使用代码制作 Swift Playground 时:
let c = Contact()
c.objectWillChange.sink print("This prints")
c.age += 1
objectWillChange
触发并打印行。
到目前为止一切顺利。
我现在在 SwiftUI 中创建一个视图:
struct ContentView: View
@ObservedObject var contact = Contact
...
我在 AppDelegate 中创建这个视图,然后:
contentView.contact.objectWillChange.sink print("This doesn't print.")
我已将联系人连接到各种控件,更改任何字段都会更新所有控件。做onReceive(contact.objectWillChange)
也可以。但没有在 AppDelegate 中连接到它。我已经尝试记录deinit()
以确保我们谈论的是同一个对象。我试过使用ImmediateScheduler
。没有骰子。为什么这不起作用?
【问题讨论】:
当初为什么要在appDelegate中创建一个View? ?????? 在 macOS 上,新项目创建NSWindow
并将 contentView
设置为 NSHostingView(rootView: ContentView())
在ContentView.swift
做吧
即使在ContentView.swift
中这样做也不起作用,如果我在构造函数或类似的东西中这样做。
【参考方案1】:
当您使用.sink
创建订阅时,您必须保存返回的AnyCancellable
对象
let cancellable = publisher.sink ...
如果将其分配给变量,请确保它不是短命的。一旦可取消对象被释放,订阅也会被取消。
【讨论】:
谢谢,就是这样!它甚至试图警告我我忽略了来自sink()
的返回值,但我对学校来说太酷了......以上是关于SwiftUI:为啥 ObservedObject 在 AppDelegate 中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
通用结构 'ObservedObject' 要求 'Video' 符合 SwiftUI 中的 'ObservableObject'
SwiftUI - 尽管使用了 @Published 和 @ObservedObject,但视图不会更新
SwiftUI:如何在 Pageable 中访问 ObservedObject?
SwiftUI - ObservedObject 永远不会被释放