Swiftui 路由设计基础

本篇介绍一下在iOS16以上如何设计swiftui路由功能

目标

先讲讲一个路由希望能实现的功能吧.

  1. 定义多个模型跳转
  2. 支持参数,本地模型参数
  3. 支持本地路由
  4. 支持远程路由
  5. 支持注册
  6. 支持结果数据回调 目前的项目需要,我目前实现的是前三条功能,45我提供下思路,后续也许会更新,6的话目前没有太好的办法

问题讨论

为什么说需要在iOS16以上才能用

因为在swiftui设计中,他们提供的绝大部分api都是点击跳转,而本篇设计路由的api是围绕下面这个api设计,此api需要iOS16以上才能使用.

iOS16是否有办法设计路由呢

勉勉强强也是可以的,下面这个api提供了一个binding数据来支持代码跳转,不过写起来还是别扭,这里就不做展开了

功能实现

路由跳转模型

仅需实现Hashable,使用枚举的原因是struct,class都需要构造参数,如果有很多自定义参数的话写起来也麻烦,enum则方便很多,而且遍历的时候也能检查到所有路由. 对于模块化来说,每个模块自己建立自己的路由地址,然后注册到主项目中即可,比如MineDestination,MessageDestination,LiveDestination,而且这块儿也能解决掉注册路由的问题,我个人到目前为止没有遇到过需要动态注册路由,动态删除路由的需要(在我个人看来,路由的前置判断拦截即可)

路由跳转控制类

swiftui本身提供了一个跳转类, NavigationPath

该类提供了一系列api,这东西本质其实就是个数组,但是他不支持获取到数组中的元素,比如我想支持到backToController就很难实现.

swift 复制代码
public mutating func append<V>(_ value: V) where V : Hashable
public mutating func removeLast(_ k: Int = 1)

后来我发现自定义的路径数组也能够支持到路由跳转观察,于是就果断更换成自定义的数组,实现起来更自由.

路由注册逻辑

路由注册我给View写了个拓展,将所有的路由都注册进来,模块化的话可以遍历所有模块的enum来处理.

路由使用

远程路由

本地路由如上面所示,远程路由应与本地路由拆开,在远程路由解析完成后,转到本地路由解析,这个转化逻辑应该由各个子模块自己实现,子模块自己提供远程路由的解析功能. 我在iOS(Swift) 路由设计二 - 简书 (jianshu.com)中曾经写了一篇完完全全使用远程路由解析的uikit路由设计,其实现在回过头看还是稍微有些幼稚,本地路由和远程路由本就可以相互分解,我却硬生生将其柔和在一起,使得代码中调用也需要使用dictionary传参,确实太过幼稚,当时甚至还将它发布到了cacaoapod库去了(其实只是为了测试一下公共库发布流程😆)

结果数据回调

这块儿我确实没有什么好办法实现,比如跳转到生日选择页面,等待生日结果的返回,这块儿flutter做的确实就很舒服.我目前写完的swiftuiApp也是比较简单的项目,没有几个页面需要支持结果范围,所以就统一封装了个通知来处理

结尾

其实路由这块儿还有一些坑,当时也是边踩边填,比如NavigationStack使用位置的问题,导致viewmodel会先释放一次等等,比如根页面替换问题需要注意NavigationStack的rootController等等,这块儿就不多说了,本篇只是个基础介绍篇,如果有什么好的理解或建议,欢迎评论.如果本文对你有一点点帮助,希望能帮忙点点赞,万分感谢!

相关推荐
吴Wu涛涛涛涛涛Tao2 天前
基于TCA构建Instagram克隆:SwiftUI状态管理的艺术
ios·swiftui
麦兜*4 天前
Swift + Xcode 开发环境搭建终极指南
开发语言·ios·swiftui·xcode·swift·苹果vision pro·swift5.6.3
大熊猫侯佩6 天前
「内力探查术」:用 Instruments 勘破 SwiftUI 卡顿迷局
swiftui·debug·xcode
HarderCoder6 天前
深入理解 SwiftUI 的 ViewBuilder:从隐式语法到自定义容器
swiftui·swift
东坡肘子6 天前
我差点失去了巴顿(我的狗狗) | 肘子的 Swift 周报 #098
swiftui·swift·apple
黄鹤的小姨子8 天前
SwiftUI 劝退实录:AI 都无能为力,你敢用吗?
swiftui
麦兜*9 天前
【swift】SwiftUI动画卡顿全解:GeometryReader滥用检测与Canvas绘制替代方案
服务器·ios·swiftui·android studio·objective-c·ai编程·swift
东坡肘子13 天前
苹果首次在中国永久关闭了一家 Apple Store | 肘子的 Swift 周报 #097
swiftui·swift·apple
大熊猫侯佩17 天前
WWDC 25 玻璃态星际联盟:SwiftUI 视图协同“防御协议”
swiftui·swift·wwdc
东坡肘子20 天前
Xcode 26 beta 4,要崩我们一起崩 | 肘子的 Swift 周报 #096
swiftui·swift·apple