watchOS 2:在初始接口控制器上设置属性
Posted
技术标签:
【中文标题】watchOS 2:在初始接口控制器上设置属性【英文标题】:watchOS 2: setting properties on initial Interface Controller 【发布时间】: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
【参考方案1】:
您可以将代码移至 applicationDidBecomeActive。
此页面描述手表应用的状态。调用 applicationDidFinishLaunching 时,应用处于非活动状态。
https://developer.apple.com/library/watchos/documentation/WatchKit/Reference/WKExtensionDelegate_protocol/index.html
【讨论】:
不幸的是,我已经尝试过了,但是在所有扩展委托回调中WKExtension.sharedExtension().rootInterfaceController
是nil
。
为我工作 - WKExtension.sharedExtension().rootInterfaceController
之前为 nil。【参考方案2】:
如果您从另一个接口控制器中调用它,请尝试将 WKExtension.sharedExtension().rootInterfaceController
移动到 willActivate()
函数。如果它在 awake()
函数中,它似乎有时可以工作但不可靠。
【讨论】:
以上是关于watchOS 2:在初始接口控制器上设置属性的主要内容,如果未能解决你的问题,请参考以下文章
WatchOS 2.0:WCSessionDelegate 没有被调用(在模拟器中)
如何从 WatchOS 3 中的自定义通知操作中打开特定的视图控制器