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().rootInterfaceControllernil 为我工作 - WKExtension.sharedExtension().rootInterfaceController 之前为 nil。【参考方案2】:

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

【讨论】:

以上是关于watchOS 2:在初始接口控制器上设置属性的主要内容,如果未能解决你的问题,请参考以下文章

WatchOS 2.0:WCSessionDelegate 没有被调用(在模拟器中)

watchOS 应用程序在显示睡眠后重置为根视图控制器

如何从 WatchOS 3 中的自定义通知操作中打开特定的视图控制器

Wix 工具集 - 使用 RegistrySearch 在 DoAction 或属性控制事件上设置属性

你在哪里初始化视图控制器中的属性值?

使用 SwiftUI 在 WatchOS 中实现从主控制器导航到基于页面的控制器的问题