初始化课程时,WatchKit App Get的值为零

问题描述

我正在尝试更新我的应用程序以利用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时,在访问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,请按照以下步骤操作:

  1. 创建一个名称为YOUR_CLASS_ExtensionDelegate的类,以实现协议WKExtensionDelegate
  2. 确保WatchKit Extension的Info.plist中的WKExtensionDelegateClassName的值为$(PRODUCT_MODULE_NAME).YOUR_CLASS_ExtensionDelegate

在您的情况下,您已经做过1,但是应该检查2

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...