4

在 iOS 应用程序中,您可以通过以下方式获取对共享应用程序委托的引用:

迅速:
let delegate = UIApplication.sharedApplication().delegate as! AppDelegate

目标-C:
AppDelegate *delegate = [[UIApplication sharedApplication] delegate];

在 WatchKit2 App Extension 中有一个类似的 App Delegate,我想在视图控制器中获取对它的引用以访问应用程序中的共享资源,例如核心数据堆栈的 ManagedObjectModel 和 PersistentStoreCoordinator,我已经在应用代表。

但是,UIApplication.sharedApplication().delegate as! AppDelegate报告错误,

使用未解析的标识符“UIApplication”

如何访问 WatchKit2 应用扩展中的应用委托?

4

2 回答 2

8

WatchOS 2 中的WKExtension类自动为每个扩展提供一个扩展对象,以管理在所有应用程序界面控制器之间共享的行为。Apple 文档指出,您“使用扩展对象来执行应用级别的任务,例如打开 URL 和获取应用的根界面控制器。”

就像在 iOS 中一样,在您的 WatchKit 应用程序扩展中,您提供自己的委托对象,即您尝试引用的委托对象。这会自动分配给 WKExtension 对象的委托属性,并且可以使用与在 iOS 中访问 UIApplication 委托类似的方法来访问:

迅速:
let delegate = WKExtension.sharedExtension().delegate as! ExtensionDelegate

目标-C:
WKExtensionDelegate *delegate = [[WKExtension sharedExtension] delegate];

WKExtension 类的Apple 文档提供了有关功能的更多信息。


更深入一点:
WatchKit App Extensions 并非在所有情况下都必须提供 WKExtensionDelegate。正如Apple 的 WKExtensionDelegate 文档所述,“您提供委托对象并使用它来管理扩展中的生命周期事件。如果您的扩展支持可操作的通知或切换行为,则需要提供委托对象。”

您将知道您的 WatchKit 应用程序扩展是否有委托对象,如果有,那么在您的应用程序扩展生命周期中,您将不会尝试访问不存在的应用程序委托。因此,虽然WKExtension.sharedExtension().delegate是可选的(WatchKit App Extensions 可能存在于未设置委托的情况下),但as!在上面的示例中强制将返回值强制转换为非可选是安全的,因为开发人员知道他们已经设置了 WKExtensionDelegate他们的应用程序扩展。

于 2016-03-28T20:36:49.410 回答
0
extension ExtensionDelegate {
    static var shared: ExtensionDelegate {
        guard let delegate = WKExtension.shared().delegate as? ExtensionDelegate else {
            fatalError("ExtensionDelegate")
        }
        return delegate
    }
}
于 2017-03-17T10:14:09.997 回答