初始化时 WatchKit App Get 为 Nil class
WatchKit App Get's Nil when initializing class
我正在尝试更新我的应用程序以利用 SwiftUI 架构。它是一个独立的 WatchKit 应用程序。我曾经使用委托方法在视图之间传递一些键 类。由于我正在尝试使用 environmentObject,因此我想通过委托初始化初始 类(它们相互依赖)。
鉴于我使用的是 SwiftUI 方法,我在 @main.
中重新创建了 AppDelegate
import SwiftUI
class AppDelegate: NSObject, WKExtensionDelegate {
var class1: Class1?
var class2: Class2! = Class2()
var class3: Class3!
func application(_ application: WKExtension) -> Bool {
return true
}
}
@main
struct WatchApp: App {
@WKExtensionDelegateAdaptor(AppDelegate.self) var delegate
init() {
delegate.class1 = Class1()
delegate.class2 = Class2()
delegate.class3 = Class3()
}
@SceneBuilder var body: some Scene {
WindowGroup {
NavigationView {
ContentView()
.environmentObject(delegate.class3)
.environmentObject(delegate.class2)
.environmentObject(delegate.class1)
}
}
WKNotificationScene(controller: NotificationController.self, category: "myCategory")
}
}
当 Class 3 get 被调用时,我在 AppDelegate 的访问中得到一个 nil 值并崩溃。
#if os(macOS)
let delegate = NSApplication.shared.delegate as! AppDelegate
#elseif !os(watchOS)
let delegate = UIApplication.shared.delegate as! AppDelegate
#else
let delegate = WKExtension.shared().delegate as! AppDelegate //<HERE's The Crash - Thread 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
#endif
}
并且在 info.plist
<key>WKExtensionDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).AppDelegate</string>
我是否忽略了一个明显的事情?
WKExtension.shared() 总是被定义,但是 delegate
属性 可能是 nil。使用 as!
会使您的应用程序崩溃
您必须提供委托来处理扩展中的生命周期事件,请参阅 Apple Doc
要为扩展分配 AppDelegate,请按照以下步骤操作:
- 创建一个名为
YOUR_CLASS_ExtensionDelegate
的 class 实现协议 WKExtensionDelegate
。
- 确保WatchKit扩展中Info.plist中
WKExtensionDelegateClassName
的值为$(PRODUCT_MODULE_NAME).YOUR_CLASS_ExtensionDelegate
在你的情况下,你已经做了 1,但你应该检查 2
我正在尝试更新我的应用程序以利用 SwiftUI 架构。它是一个独立的 WatchKit 应用程序。我曾经使用委托方法在视图之间传递一些键 类。由于我正在尝试使用 environmentObject,因此我想通过委托初始化初始 类(它们相互依赖)。
鉴于我使用的是 SwiftUI 方法,我在 @main.
import SwiftUI
class AppDelegate: NSObject, WKExtensionDelegate {
var class1: Class1?
var class2: Class2! = Class2()
var class3: Class3!
func application(_ application: WKExtension) -> Bool {
return true
}
}
@main
struct WatchApp: App {
@WKExtensionDelegateAdaptor(AppDelegate.self) var delegate
init() {
delegate.class1 = Class1()
delegate.class2 = Class2()
delegate.class3 = Class3()
}
@SceneBuilder var body: some Scene {
WindowGroup {
NavigationView {
ContentView()
.environmentObject(delegate.class3)
.environmentObject(delegate.class2)
.environmentObject(delegate.class1)
}
}
WKNotificationScene(controller: NotificationController.self, category: "myCategory")
}
}
当 Class 3 get 被调用时,我在 AppDelegate 的访问中得到一个 nil 值并崩溃。
#if os(macOS)
let delegate = NSApplication.shared.delegate as! AppDelegate
#elseif !os(watchOS)
let delegate = UIApplication.shared.delegate as! AppDelegate
#else
let delegate = WKExtension.shared().delegate as! AppDelegate //<HERE's The Crash - Thread 1:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
#endif
}
并且在 info.plist
<key>WKExtensionDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).AppDelegate</string>
我是否忽略了一个明显的事情?
WKExtension.shared() 总是被定义,但是 delegate
属性 可能是 nil。使用 as!
会使您的应用程序崩溃
您必须提供委托来处理扩展中的生命周期事件,请参阅 Apple Doc
要为扩展分配 AppDelegate,请按照以下步骤操作:
- 创建一个名为
YOUR_CLASS_ExtensionDelegate
的 class 实现协议WKExtensionDelegate
。 - 确保WatchKit扩展中Info.plist中
WKExtensionDelegateClassName
的值为$(PRODUCT_MODULE_NAME).YOUR_CLASS_ExtensionDelegate
在你的情况下,你已经做了 1,但你应该检查 2