在 SwiftUI 生命周期中投射 AppDelegate
Cast AppDelegate in SwiftUI Lifecycle
在具有 SwiftUI 生命周期的 App 中,您如何执行以下转换,其中 AppDelegate 实现为 NSApplicationDelegateAdaptor
?
let appDelegate = NSApplication.shared.delegate as! AppDelegate
// or
let appDelegate = NSApp.delegate as! AppDelegate
以上抛出以下错误:
Could not cast value of type 'SwiftUI.AppDelegate' (0x1e28fae40) to 'MyApp.AppDelegate' (0x102d277c0).
后台在扩展中使用 AppDelegate
extension NSStatusBarButton {
public override func mouseDown(with event: NSEvent) {
super.mouseDown(with: event)
let appDelegate = NSApp.delegate as! AppDelegate
// do stuff with appDelegate on MouseDown Event
}
}
我们不能转换,因为 NSApp 的委托不是我们的委托,而是内部的,它会将一些回调重定向到通过适配器注入的回调。
我们可以通过适配器的变量直接访问我们的委托:
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
或通过 EnvironmentObject
(因为 AppDelegate
已确认 ObservableObject
协议),它会自动注入到 ContentView
中,因此在所有子视图中都可用:
struct MyView: View {
@EnvironmentObject var appDelegate: AppDelegate
// ...
在具有 SwiftUI 生命周期的 App 中,您如何执行以下转换,其中 AppDelegate 实现为 NSApplicationDelegateAdaptor
?
let appDelegate = NSApplication.shared.delegate as! AppDelegate
// or
let appDelegate = NSApp.delegate as! AppDelegate
以上抛出以下错误:
Could not cast value of type 'SwiftUI.AppDelegate' (0x1e28fae40) to 'MyApp.AppDelegate' (0x102d277c0).
后台在扩展中使用 AppDelegate
extension NSStatusBarButton {
public override func mouseDown(with event: NSEvent) {
super.mouseDown(with: event)
let appDelegate = NSApp.delegate as! AppDelegate
// do stuff with appDelegate on MouseDown Event
}
}
我们不能转换,因为 NSApp 的委托不是我们的委托,而是内部的,它会将一些回调重定向到通过适配器注入的回调。
我们可以通过适配器的变量直接访问我们的委托:
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
或通过 EnvironmentObject
(因为 AppDelegate
已确认 ObservableObject
协议),它会自动注入到 ContentView
中,因此在所有子视图中都可用:
struct MyView: View {
@EnvironmentObject var appDelegate: AppDelegate
// ...