如何解决无法将SwiftUI.ExtensionDelegate转换为ExtensionDelegate
使用SwiftUI Architecture 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.
}
}
在我的@main中-我有以下内容:
@main
struct WatchApp: App {
@WKExtensionDelegateAdaptor(ExtensionDelegate.self) var delegate
// code
}
当我尝试以-身份访问委托时
let delegate = WKExtension.shared().delegate as! ExtensionDelegate
我收到上述错误。
解决方法
WKExtension.shared().delegate
不是您的ExtensionDelegate,而是内部 SwiftUI.ExtensionDelegate
(如上所述),它为适配器提供了 delegate 。您必须使用(遍地传递)仅为您的via提供的适配器委托实例
@WKExtensionDelegateAdaptor(ExtensionDelegate.self) var delegate
更新:
要使用您的delegate
,您必须将其作为参数传递给视图旁边,例如作为环境(因此您可以在任何子视图中将其用作@Environment(\.appDelegate) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
.environment(\.appDelegate,delegate)
}
}
和
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
}
}
}
,
嗯,-与此同时,我收集了更多经验。对于我的应用程序委托,重要的是它是一个单例(只存在一个实例)。我意识到我有两个。
@NSApplicationDelegateAdaptor(AppDelegate.self) var applicationDelegate
在 SwiftUI App 结构中初始化第一个。我向这个 App 结构添加了一个 init() 方法。
init() {
AppDelegate.shared = self.applicationDelegate
}
这会在程序的早期初始化我的 AppDelegate 静态变量“共享”。
我删除了所有基于@Environment 的对委托、密钥、默认值等的访问。全局访问由
保证AppDelegate.shared
自定义@Environment 变量的问题是,它们只能在视图上使用 .environment(_ keyPath:,_ value:) 修饰符进行设置。但是,在第一个视图设置环境变量之前访问我的委托。因此,我的 AppDelegate 共享变量现在是一个普通的静态变量,我尽可能早地为自己设置:在 App 结构的 init() 方法中。
,我在 macOS 中遇到了同样的问题。在@main App 结构中使用声明一个类作为应用程序委托后:
@NSApplicationDelegateAdaptor(AppDelegate.self) var applicationDelegate
AppDelegate 在应用程序启动时正确初始化。 我声明环境键:
struct DelegateKey: EnvironmentKey {
typealias Value = AppDelegate
static let defaultValue: AppDelegate = AppDelegate()
}
extension EnvironmentValues {
var appDelegate: DelegateKey.Value {
get {
return self[DelegateKey.self]
}
set {
self[DelegateKey.self] = newValue
}
}
}
通过访问变量
@Environment(\.appDelegate) var appDelegate
这适用于所有 SwiftUI 环境。
问题是对应用程序委托的一般访问通过
NSApp.delegate
不再起作用。
解决方法是在 AppDelegate 类本身中声明一个静态变量:
class AppDelegate: NSObject,NSApplicationDelegate,ObservableObject {
@Environment(\.appDelegate) static var shared
}
这使得实例化的 AppDelegate 对象可以通过以下方式从任何地方访问:
AppDelegate.shared
.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。