HUDViewModify 封装完毕,我们添加在 LoginPage 主页面上面,首先需要在 LoginViewModel 新增一个 isLoadingHUD 的参数。

在 LoginPage 将 HUD 添加在最外层。

那么我们在 LoginPageViewModel 中的 login 方法在请求之前开始 HUD,和在请求完毕结束 HUD。

但是我们发现一个问题,是我们不注意导致的,我们竟然没有在初始化状态隐藏底部的背景,导致初始化状态就看到一个黑色的背景。

我们修改一个 HUDViewModify 的代码。

@MainActor 在 async 方法更新 UI
这样初始化状态不显示,当需要隐藏 HUD 的时候一起隐藏。我们修改完毕之后,我们测试一下登录功能。
从表面上一切都正常,但是我们看到打印的 Log,发现我们更新UI不在主线程,那么在Release就会导致出问题。
shell
[SwiftUI] Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates.
我们在 async 的方法内部怎么回到主线程更新 UI,我们还是用之前的方式更新吗?

也是可以的 ,但是我们出来了 async/await 还这么麻烦吗?大难是否定的,我们有一个 @MainActor 的修饰符。关于 @MainActor 大家可以参考下面的文章了解一下。


通过 @MainActor 装饰我们的 LoginPageViewModel 之后,我们就可以正常通过设置 @Published 值进行更新 SwiftUI 了。
但是我们执行登录请求,虽然也看到加动画和消失动画。对于用户来说,也不知道这次登录时是成功还是失败。虽然可以通过登录成功进入首页做到这一点,但是请求接口完毕做一个提示还是好的。
修改支持提示纯文本
我们修改一下 HUDView 允许可以显示提示的文本,修改的代码如下。

但是我们显示 UI 发生了变化,结果成为了下面显示的样子。

调整 HUD 大小等于内容大小
这和我们预想的不一样,我们预想的不管组件多大,我们都会在最外层添加一个 Padding,并且设置大小为 Fit 的大小。
我们想到我们设置地步黑色区域为宽度和高度相等,现在中间的文件是宽度大于高度,所以按照等比。那么背景大小宽度就等于高度,导致这个样子的出现。

我们删掉了上面的代码,界面效果恢复了。


现在是我们的文本比较长,但是当我们显示一个特别短的文本会是怎么样的 UI 呢?

设置最短显示宽度
这个也说的过去,但是总觉得显示宽度太短了,我们想设置最短的宽度为 50。


此时看起来还差不多。
我们就让 LoginPage 的登录操作,报错就提示错误,否则就提示成功。


延时 2 秒消失
但是我们的提示不会消失了,我们设置提示完毕之后延时 2 秒消失。


此时我们已经做到请求完毕提示 2 秒之后消失。