为 SwiftUI Apple Watch App 实现基于页面的导航

Posted

技术标签:

【中文标题】为 SwiftUI Apple Watch App 实现基于页面的导航【英文标题】:Implementing Page Based Navigation for SwiftUI Apple Watch App 【发布时间】:2019-12-11 09:08:43 【问题描述】:

我正在使用 SwiftUI 构建 Apple Watch 应用,并希望实现基于页面的导航,因此当用户在主屏幕上向左滑动时,他们会被带到另一个视图。

我了解如何使用 NavigationLink 让用户从一个屏幕移动到另一个屏幕,但不了解如何让用户通过向左或向右滑动来从一个屏幕导航到另一个屏幕。

有谁知道如何做到这一点?

【问题讨论】:

我刚刚在另一个帖子里回答了这个问题***.com/questions/58036807/… 【参考方案1】:

这里是如何使用 SwiftUI 为 watchOS 实现基于页面的导航的指南。描述基于Hacking with watchOS, SwiftUI edition:

首先,创建一个新的 SwiftUI 视图,例如 CounterView。

其次,创建 WKHostingController 的子类以显示新的 SwiftUI 视图。只需复制 HostingController.swift 中已经存在的控制器并将其名称更改为 CounterHostingController。文件 HostingController.swift 然后包含这两个控制器:

class HostingController: WKHostingController<ContentView> 
    override var body: ContentView 
        return ContentView()
    


class CounterHostingController: WKHostingController<CounterView> 
    override var body: CounterView 
        return CounterView()
    

第三,通过打开文件 Interface.storyboard 并单击 Xcode 窗口右上角的 + 按钮,创建一个故事板场景来存储新创建的主机控制器。在搜索框中输入“Hosting Controller”,拖出一个新的 Hosting Controller 并将其移动到现有的 Hosting Controller 旁边。在身份检查器中(单击 Xcode 窗口右侧从顶部开始的第二个菜单中的第四个项目,该项目显示一个文档,该文档的左上角有一张图片并在其周围浮动文本),将 Class 更改为“ CounterHostingController”,然后选中“从目标继承模块”框。

第四,为了将这两个屏幕连接为同一用户界面的页面,在情节提要中按 Ctrl 并用鼠标单击原始主机控制器并按住键,同时将鼠标指针拖动到新控制器上,然后,释放鼠标按钮后,选择“下一页”进行关系segue。

【讨论】:

这非常有用,但我想知道是否有办法制作另一个WKHostingController,可以从初始控制器的左侧附加并获取。使用next page segue 将其添加到右侧,我不知道如何使某些东西滑到左侧(previous page segue?) 我想这是不可能的,因为这样的非标准导航可能会导致用户混淆。 我想要实现的是 Apple Watch 上的锻炼应用程序。您有显示您当前锻炼的初始视图,左侧视图是暂停/停止等,右侧视图(当前锻炼)是正在播放。我希望有 3 个并排的视图,并在中间有初始视图,但我不确定这是否可以通过情节提要完成。 @yangnom 查看developer.apple.com/documentation/watchkit/storyboard_elements/…,特别是上面写着“您可以通过在其 init() 或 awake(withContext:) 方法中调用接口控制器的 becomeCurrentPage() 方法来指定不同起点的行。”【参考方案2】:

您可以使用多个 WKHostingController 将它们绑定到使用 Storyboard 的页面中。 每个 WKHostingController 都将代表您导航流程中的页面。

【讨论】:

以上是关于为 SwiftUI Apple Watch App 实现基于页面的导航的主要内容,如果未能解决你的问题,请参考以下文章

Apple Watch 模态表中的 SwiftUI 图像

Swiftui - Apple Watch 上的金属渲染

在 SwiftUI 中使用 WCSession 向 Apple Watch 发送消息

带有 SwiftUI 的 Apple Watch 上列表项的背景 [重复]

Apple Watch SwiftUI 地图事件?如何读取数字表冠旋转的当前区域跨度?

SwiftUI .rotation3dEffect 动画在 Apple Watch 列表行中没有所需的深度效果