swift - 如何从另一个控制器中关闭 WKInterfaceController?
问题描述
我正在创建我的第一个 WatchOS 应用程序作为 iOS 应用程序的伴侣。
手表应用程序需要能够显示一个宾果球,其号码是从手机发送的。因为我不能用 WatchOS 覆盖图像,所以我创建了 6 个 WKInterfaceControllers。一个是“主”控制器,另外 5 个每个都有一个独特的背景图像,这是一个正确颜色(蓝色、红色、灰色、绿色和黄色)的宾果球,然后我用球的字母和数字覆盖一个标签(即 B14)。我找不到动态操作单个 WKInterfaceController 的背景图像的方法 - 但如果有办法这样做 - 我将非常感谢有关如何执行此操作的提示,并且我的其他问题将不存在。
目前,我正在使用主控制器中的 WatchConnectivity 来接收来自手机的更新。当电话发送一个号码时,代码确定它需要的颜色,然后以下代码为 WKInterfaceController 提供正确的颜色背景:
let nextName = "\(ballColor)Controller"
DispatchQueue.main.async {
self.presentController(withName: nextName, context: message)
WKInterfaceDevice().play(.click)
}
我遇到的问题是,一旦我激活了第一个颜色控制器,我就无法在不关闭当前活动的控制器的情况下激活不同的颜色控制器。
那么 - 我该怎么做呢?我想我只需要一种方法来保存对活动控制器的引用,这样我就可以在激活下一个球之前关闭它——但我不知道该怎么做。
如果有人能在这里帮助我指出正确的方向,我将不胜感激……
提前致谢
解决方案
我不知道我最初的问题是否有答案。从我所见,似乎不可能存储对活动 WKInterfaceController 的引用并从另一个控制器与之交互 - 但我确实找到了解决我的潜在问题的方法。我发布我的发现,以防其他人像我一样陷入困境。
我的错误印象是,在 WatchKit 中将文本覆盖在图形上的唯一方法是将 WKInterfaceController 背景设置为图像,然后在其上放置标签 - 但 WKInterface 控制器的背景图像属性无法设置以编程方式,因此我为要使用的每个不同背景图像创建了一个单独的 WKInterfaceController 实例。但正如我所料,还有另一种更好的方法。
“组”对象还具有背景图像属性,可以通过编程方式进行设置。
我删除了我的 5 个单独的接口控制器并将它们替换为 1 个包含一个组的接口控制器,然后我以编程方式从 session:didReceiveMessage 将组的背景图像设置为从手机接收的最新数据的适当图像。
唯一仍然存在的复杂性是,我仍然无法从我的主 WKInterfaceController 操作此 WKInterfaceController 上的任何内容,该主 WKInterfaceController 也用作我的 WCSessionDelegate。我发现解决这个问题的唯一方法是通过在显示第二个控制器之前立即将 session:didReceiveMessage 函数中的 WCSession.default.delegate 设置为 nil 来停用 WCsession,然后在第二个控制器中的 awake:withContext 中再次激活它还要求我导入 WatchConnectivity 并符合 WCSessionDelegate。
推荐阅读
- python - Loading spatialite with python3's module under Windows
- c++ - Template function in constructor
- opengl-es - glGenBuffers fails to create one despite GL_NO_ERROR
- rxjs - convert a function into rxjs observable
- sql - 如何在 Access 查询中计算累进总和
- bootstrap-4 - 如何让 Bootstrap 4 使用屏幕的整个宽度?
- sql - 对分组记录唯一值运行聚合函数
- java - 实例化 RemoteWebDriver 时出错
- angularjs - angularjs:插值/绑定发生后的事件
- git - Git 切换树