【发布时间】:2015-12-25 18:20:19
【问题描述】:
从 watchOS 2 开始,我们有一个 ExtensionDelegate 对象,类似于 UIApplicationDelegate(对应用生命周期事件作出反应)。
我想获取对第一个 Interface Controller 对象的引用,该对象将在启动时显示,以在其上设置属性(例如,传入数据存储对象)。
根据docs,WKExtension 上的rootInterfaceController 属性交还初始控制器:
根界面控制器位于应用程序的主情节提要中 并具有与之关联的主入口点对象。 WatchKit 在启动时显示根接口控制器,尽管 应用程序可以在启动前呈现不同的界面控制器 序列结束。
所以我在ExtensionDelegate 中尝试以下操作:
func applicationDidFinishLaunching() {
guard let initialController = WKExtension.sharedExtension().rootInterfaceController else {
return
}
initialController.dataStore = DataStore()
}
即使显示了正确的接口控制器,rootInterfaceController 在这一点上也为零。有趣的是,如果我在接口控制器的willActivate() 中查询相同的属性,则该属性设置正确。
在 iOS 应用程序中,您已经可以在 applicationDidFinishLaunching() 中获取根视图控制器,我认为它在 watchOS 上应该也能正常工作。
有没有办法在我的界面控制器(从外部)显示之前设置它的属性?这是一个错误吗?
非常感谢您的回答!
【问题讨论】:
-
您找到原因了吗? @józsef-vesza
-
@Wilmar 不幸的是没有。在这个阶段,
rootInterfaceController似乎为零,所以我最终在我的接口控制器子类中实例化了我的属性。不是很好,但这是我迄今为止最好的。 :// -
嗯,我明白了。我在代码中添加了一个
dispatch_after,将其设置为1 秒,然后rootInterfaceController属性具有预期值。相当令人沮丧。 @józsef-vesza -
嗯。有趣的。我不想再添加任何延迟(启动时间已经很长了),但这是一个有趣的信息,谢谢!是的,这很令人沮丧,我希望扩展委托的行为类似于 iOS 中的应用委托。
-
同意加载时间。我只是添加它以查看该值是否最终被设置。还必须重新构建我的委托逻辑以不依赖于回调。 @józsef-vesza
标签: ios swift watchkit apple-watch watchos-2