watchOS 2:在初始接口控制器上设置属性

8
从watchOS 2开始,我们有一个ExtensionDelegate对象,类似于UIApplicationDelegate(响应应用程序生命周期事件)。
我想获取对将在启动时显示的第一个界面控制器对象的引用,以设置其属性(例如传递数据存储对象)。
根据docsWKExtension上的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
很遗憾,@Wilmar。看起来在这个阶段rootInterfaceController是空的,所以我最终在我的接口控制器子类中实例化了我的属性。不是很好,但这是我目前能做到的最好的。 :/ - József Vesza
嗯,我明白了。我在我的代码中添加了一个dispatch_after,将其设置为1秒,然后rootInterfaceController属性具有预期的值。非常令人沮丧。@józsef-vesza - Wilmar
嗯,有趣。我不想再增加任何延迟(启动时间已经很长了),但这是一个有趣的信息,谢谢!是的,这很令人沮丧,我期望扩展代理在iOS中像应用程序代理一样运行。 - József Vesza
同意关于加载时间的问题。我只是添加了它,以查看值是否最终被设置。还必须重新设计我的委托逻辑,以不依赖于回调。@józsef-vesza - Wilmar
我也遇到了这个问题。有时候我会看到applicationDidFinishLaunching被调用两次,在第二次调用中,rootInterfaceController不再是nil。非常奇怪。你是否已经提交了一个radar?如果你提交了,我很乐意复制它。 - Jeff V
2个回答

0

3
很遗憾,我已经尝试过这个了,但是在所有的扩展委托回调中,WKExtension.sharedExtension().rootInterfaceController 都是 nil - József Vesza
对我有用 - WKExtension.sharedExtension().rootInterfaceController 之前为 nil。 - Joshua C. Lerner

0
如果您正在从另一个界面控制器中调用此函数,请尝试将WKExtension.sharedExtension().rootInterfaceController移动到willActivate()函数中。似乎如果它在awake()函数中,有时会工作但不可靠。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接