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 永远不会被释放

SwiftUI:@ObservedObject 与 @StateObject 子视图性能?

SwiftUI - 如何基于@ObservedObject 为每个列表视图项创建编辑视图