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等等,这块儿就不多说了,本篇只是个基础介绍篇,如果有什么好的理解或建议,欢迎评论.如果本文对你有一点点帮助,希望能帮忙点点赞,万分感谢!

相关推荐
用户091 天前
SwiftUI Charts 函数绘图完全指南
ios·swiftui·swift
东坡肘子2 天前
完成 Liquid Glass 的适配了吗?| 肘子的 Swift 周报 #0102
swiftui·swift·apple
大熊猫侯佩4 天前
iOS 26 仅需几行代码让 SwiftUI 7 液态玻璃界面焕发新春
前端·swiftui·apple
东坡肘子9 天前
从开放平台到受控生态:谷歌宣布 Android 开发者验证政策 | 肘子的 Swift 周报 #0101
android·swiftui·swift
HarderCoder10 天前
深入理解 SwiftUI 的 Structural Identity:为什么“换个条件分支”就会丢状态?
swiftui·swift
YungFan10 天前
Swift 6.2 新特性
swiftui·swift
大熊猫侯佩14 天前
当液态玻璃计划遭遇反叛者:一场 iOS 26 界面的暗战
swiftui·xcode·apple
雪糕吖14 天前
SwiftUI 自定义 Shape:实现顶部圆角矩形 RoundedTopRectangle
ios·swiftui
东坡肘子16 天前
写给这段旅程,也写给未来的自己 | 肘子的 Swift 周报 #0100
swiftui·swift·apple
大熊猫侯佩21 天前
SwiftUI 三阵诀:杨过绝情谷悟 “视图布阵” 之道
swiftui·swift·apple