无法将 SwiftUI.ExtensionDelegate 转换为 ExtensionDelegate

Mic*_*owe 3 watchos swiftui

使用 SwiftUI 架构 WatchOS 应用程序,如果您想使用 ExtensionDelegate,您需要创建自己的。我已经这样做了,但是当我尝试实际访问代码中的委托时,我收到以下错误消息无法转换类型的值SwiftUI.ExtensionDelegate' (0x7fff8441b480) to 'TestMe_WatchKit_Extension.ExtensionDelegate' (0x10c3b36d0).
我已将 ExtensionDelegate 定义为 -

class ExtensionDelegate: NSObject, WKExtensionDelegate {
    var meetingStatistics:  MeetingStatistics = MeetingStatistics()
    override init(){
        super.init()
    }
    func applicationDidFinishLaunching() {
        // Perform any final initialization of your application.
        print("applicationDidFinishLaunching for watchOS")
    }
    func applicationDidBecomeActive() {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }
    func applicationWillResignActive() {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, etc.
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的@main - 我有以下内容:

@main
struct WatchApp: App {
@WKExtensionDelegateAdaptor(ExtensionDelegate.self) var delegate
// code

}
Run Code Online (Sandbox Code Playgroud)

当我尝试访问委托时 - let delegate = WKExtension.shared().delegate as! ExtensionDelegate我收到上述错误。

Asp*_*eri 5

WKExtension.shared().delegate不是您的 ExtensionDelegate 而是内部 SwiftUI.ExtensionDelegate(如上所述),它提供您的适配器委托。您必须使用(到处传递)为您的 via 提供的适配器委托实例

@WKExtensionDelegateAdaptor(ExtensionDelegate.self) var delegate
Run Code Online (Sandbox Code Playgroud)

更新:

要使用您,delegate您必须将其作为参数传递给视图,例如作为环境(因此您可以在任何子视图中使用它作为@Environment(\.appDelegate) var appDelegate

var body: some Scene {
    WindowGroup {
       ContentView()
          .environment(\.appDelegate, delegate)
    }
}
Run Code Online (Sandbox Code Playgroud)

struct DelegateKey: EnvironmentKey {
    typealias Value = ExtensionDelegate?
    static let defaultValue: ExtensionDelegate? = nil
}

extension EnvironmentValues {
    var appDelegate: DelegateKey.Value {
        get {
            return self[DelegateKey.self]
        }
        set {
            self[DelegateKey.self] = newValue
        }
    }
}

Run Code Online (Sandbox Code Playgroud)


M W*_*ilm 3

嗯,- 与此同时我收集了更多的经验。对于我的应用程序委托来说,重要的是它是单例(仅存在一个实例)。我意识到我有两个。

@NSApplicationDelegateAdaptor(AppDelegate.self) var applicationDelegate
Run Code Online (Sandbox Code Playgroud)

在 SwiftUI App 结构中初始化第一个。我向这个 App 结构添加了一个 init() 方法。

 init() {
  
  AppDelegate.shared = self.applicationDelegate
}
Run Code Online (Sandbox Code Playgroud)

这在程序的早期就初始化了我的 AppDelegate 静态变量“共享”。

我删除了所有基于 @Environment 的对委托、密钥、默认值等的访问。全局访问由以下方式保证

AppDelegate.shared
Run Code Online (Sandbox Code Playgroud)

自定义 @Environment 变量的问题是,它们只能在视图上使用 .environment(_ keyPath:, _ value:) 修饰符进行设置。但是,在第一个视图设置环境变量之前访问我的委托。因此,我的 AppDelegate 共享变量现在是一个普通的静态变量,我尽早自己设置它:在 App 结构的 init() 方法中。