WKExtension.shared().delegate = self 现在显示无法分配给属性:'delegate' 是一个只能获取的属性

Ryu*_*lio 5 swift watchkit xcode11

用于后台任务的 WatchOS 代码需要WKExtention.shared().delegate将 设置为self,但现在显示一条错误消息:

无法分配给属性:“delegate”是一个只能获取的属性

如果我删除该行,则在触发后台任务时我不会收到更新,因为我以前可以接收。

我上下查看了 StackOverflow 以及 Google 和 Apple 文档,但找不到答案。为什么该行在以前工作正常时现在显示错误。

创建一个新的 WatchKit 应用程序并InterfaceControllerVC.swift 添加WKExtensionDelegate到类中,然后:

    override func awake(withContext context: Any?) {
      super.awake(withContext: context)

      WKExtension.shared().delegate = self
   }
Run Code Online (Sandbox Code Playgroud)

线路:

    WKExtension.shared().delegate = self
Run Code Online (Sandbox Code Playgroud)

被标记为红色并显示错误为:

无法分配给属性:“delegate”是一个只能获取的属性

小智 9

关于如何使用现代 SwiftUI 应用程序执行此操作的文档并不多,Info.plist 方法似乎不再适用。也许这会帮助其他人更快地解决这个问题:使用WKExtensionDelegateAdaptor,类似于UIApplicationDelegateAdaptor.

@main
struct WatchApp: App  {

@WKExtensionDelegateAdaptor(ExtensionDelegate.self) var extensionDelegate

@SceneBuilder var body: some Scene {
       
...

}
Run Code Online (Sandbox Code Playgroud)


Eva*_*van 3

代理由系统自动分配,如此处所述。

Apple 文档 WKExtensionDelegate

通过执行以下操作来设置委托对象:

  1. 创建一个名为Your_Class_ExtensionDelegate 的类并实现协议WKExtensionDelegate
  2. 确保WatchKit Extension 中的WKExtensionDelegateClassNamein值为(对于 Swift 项目,模块名称是必需的。)Info.plist$(PRODUCT_MODULE_NAME).Your_Class_ExtensionDelegate