第十七章 @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 秒之后消失。

相关推荐
大熊猫侯佩2 天前
Xcode 预览新升级:arguments 让界面调试井井有条
swiftui·xcode·swift
大熊猫侯佩3 天前
WWDC26:把 SwiftUI Toolbar 真正握在手心里
swiftui·swift·apple
大熊猫侯佩3 天前
WWDC 26 全新 ResultsObserver:终于能在 View 外面盯着 SwiftData 了
swiftui·swift·apple
东坡肘子5 天前
Apple Intelligence 已通过审核,即将在中国提供服务 -- 肘子的 Swift 周报 #148
人工智能·swiftui·swift
2501_915106329 天前
SwiftUI项目创建详解:使用Xcode从零开始创建第一个App项目
ide·vscode·ios·swiftui·个人开发·xcode·敏捷流程
东坡肘子12 天前
热茶还是冰咖啡 -- 肘子的 Swift 周报 #147
人工智能·swiftui·swift
2501_9160074715 天前
SwiftUI 声明式语法与 Xcode 预览功能详解
ide·vscode·ios·swiftui·个人开发·xcode·敏捷流程
东坡肘子19 天前
不是模型变慢了,是任务变大了 -- 肘子的 Swift 周报 #146
人工智能·swiftui·swift
Lvan的前端笔记23 天前
SwiftUI:iOS 常用视图组件速查
ios·swiftui·swift
HarderCoder1 个月前
SwiftUI 可复用视图设计解剖:从语义到 API 的完整实践
swiftui·swift