第十七章 @MainActor

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

LoginPageHUD 添加在最外层。

那么我们在 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 大家可以参考下面的文章了解一下。

hicc.pro/p/swift/the...

通过 @MainActor 装饰我们的 LoginPageViewModel 之后,我们就可以正常通过设置 @Published 值进行更新 SwiftUI 了。

但是我们执行登录请求,虽然也看到加动画和消失动画。对于用户来说,也不知道这次登录时是成功还是失败。虽然可以通过登录成功进入首页做到这一点,但是请求接口完毕做一个提示还是好的。

修改支持提示纯文本

我们修改一下 HUDView 允许可以显示提示的文本,修改的代码如下。

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

调整 HUD 大小等于内容大小

这和我们预想的不一样,我们预想的不管组件多大,我们都会在最外层添加一个 Padding,并且设置大小为 Fit 的大小。

我们想到我们设置地步黑色区域为宽度和高度相等,现在中间的文件是宽度大于高度,所以按照等比。那么背景大小宽度就等于高度,导致这个样子的出现。

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

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

设置最短显示宽度

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

此时看起来还差不多。

我们就让 LoginPage 的登录操作,报错就提示错误,否则就提示成功。

延时 2 秒消失

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

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

相关推荐
君赏3 小时前
第十六章 RoundedRectangle|aspectRatio|UIViewRepresentable
swiftui
君赏3 小时前
第十八章 封装HUD和完善登录界面逻辑
swiftui
君赏3 小时前
第十五章 Task|NSAppTransportSecurity|keyDecodingStrategy
swiftui
君赏3 小时前
第十四章 async/await|overlay|PreferencrKey|Anchor
swiftui
君赏3 小时前
第十三章 Button|cornerRadius
swiftui
君赏3 小时前
第六章 Published|ObservedObject|EnvironmentObject|Environment
swiftui
君赏3 小时前
第八章 封装MVVM|onTapGesture|AppStorage
swiftui
君赏3 小时前
第十二章 TextField|EmptyView|SecureField
swiftui
君赏3 小时前
第四章 Preview Device|Expand|Alignment|LineLimit|Rectangle|ForegroundColor
swiftui