@UIApplicationDelegateAdaptor
SwiftUI iOS有了一个全新的生命周期,完全放弃了 UIKit 的应用程序和场景委托,但是有时需要使用UIKit 中UIApplicationDelegate
的传统协议:处理推送通知的注册、响应内存警告、检测时间更改等,使用UIApplicationDelegate
就可以实现。
如果需要访问SwiftUI iOS中AppDelegate
的功能,您应该创建一个继承自NSObject
的类 UIApplicationDelegate
和协议的类,并为其提供功能。
1、实现AppDelegate协议 :创建一个继承NSObject
并符合UIApplicationDelegate
协议的类
swift
class AppDelegate: NSObject, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
return true
}
}
2、使用AppDelegate :在main->App
-> Scene中使用UIApplicationDelegateAdaptor
属性包装器
scss
@main
struct YdtApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
UIApplicationDelegateAdaptor 与 ObservableObject 结合
1、让AppDelegate
继承ObservableObject
协议
swift
class AppDelegate: NSObject, UIApplicationDelegate, ObservableObject {
@Published var value: String = ""
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
self.value = "AppDelegate"
return true
}
}
2、通过环境委托(EnvironmentObject)属性包装器访问AppDelegate的值
scss
struct ContentView: View {
@EnvironmentObject var appDelegate: AppDelegate
var body: some View {
Text("Value: (appDelegate.value)")
}
}
@NSApplicationDelegateAdaptor
在上面使用 @UIApplicationDelegateAdaptor 属性包装器来绑定 UIApplicationDelegate 类。但是UIApplicationDelegate 类在 macOS 上不可以使用,我们应该使用 @NSApplicationDelegateAdaptor
属性包装器来实现功能
1、实现AppDelegate协议 NSApplicationDelegate NSWindowDelegate
swift
private final class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
var window: NSWindow?
func applicationDidFinishLaunching(_ notification: Notification) {
NSApp.delegate = self
window = NSApplication.shared.windows[0]
window?.isReleasedWhenClosed = false
window?.delegate = self
}
func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
window?.makeKeyAndOrderFront(self)
return true
}
@objc func openMainWindow(_ sender: AnyObject?) {
window?.orderFrontRegardless()
}
}
注意:
一定要添加 NSApp.delegate = self,否则点击Dock图标无法进入applicationShouldHandleReopen方法,就会创建新的NsWindow
2、使用AppDelegate
scss
@main
struct MyApp: App {
@NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
}
}
}