Alert
和ActionSheet
都是弹框的一种类型,Alert
主要是在屏幕中间弹框,有一种提示警告的作用,而ActionSheet
是从底部弹框一个界面,显示一些可以操作的列表项等等。
Alert的使用
Alert
就好比UIKit
中的UIAlertView
和UIAlertController
,在SwiftUI
中Alert
还是比较好用的,主要分3步:
- 要有能驱动弹出
Alert
的变量,即被@State
修饰的变量。 - 在
SwiftUI
组件上实现.alert()
修饰符方法,并传入绑定的变量。 - 在
.alert()
修饰符方法中返回一个Alert
组件的实例。
完成上面三步就可以弹出一个Alert
了,那比如说我这一个界面可能会弹出好几个Alert
,那如何操作呢?比如需要两个Alert,直接弄两个变量,然后添加两个.alert()
修饰符?比如下面的代码:
通过上面的效果看,显示是不行的,第二个alert()
修饰符覆盖了第一个,第一个无效了,只有第二个能弹出来。如果非要这么写,那么就把两个alert()
修饰符分别放到对应的Button
上,这样就可以了。如下:
那么如果更多的弹框,这个解决方法就很low了,更好的解决方法是和enum
结合的使用,将左右弹框类型放到enum
里面,详见下面Alert、ActionSheet与enum的组合使用一节。
话说还是奔着更简洁UI的标准,在body里面尽量少一些业务逻辑代码,我们将alert()
修饰符的content部分单独抽出来一个方法,直接返回一个Alert
实例。如下图。
关于创建Alert实例对象,方法也比较多,可以设置title
,message
,primaryButton
和secondaryButton
,两个Button
属于Alert.Button
类型。
在SwiftUI中,Alert.Button
是用于定义Alert
中的按钮的类型。Alert.Button
允许为Alert
框添加不同的按钮,并为每个按钮定义标题、样式和操作。以下是Alert.Button
的一些重要属性和用法:
- 标题(
label
):按钮显示的文本内容。需要设置Text
组件,对Text
组件设置样式无效,比如字体颜色、大小等等。 - 样式(
default
、cancel
、destructive
):按钮的样式,分别表示默认按钮、取消按钮和破坏性按钮。 - 操作(
action
):按钮被点击时执行的操作,可以是一个闭包或函数。
ActionSheet的使用
在SwiftUI
中,ActionShee
t用于显示一个操作表单,其中包含多个选项供用户选择。ActionSheet
通常用于在用户执行某些操作时显示一个选择菜单,例如确认删除操作或选择不同的操作选项。
要实现该功能还是3步走:
- 要有能驱动弹出
ActionSheet
的变量,即被@State
修饰的变量。 - 在
SwiftUI
组件上实现.actionSheet
修饰符方法,并传入绑定的变量。 - 在
.actionSheet()
修饰符方法中返回一个ActionSheet
组件的实例。
关于ActionSheet说明
title
:指定操作表单的标题。 只能通过Text
设置文本,不能再设置文本的样式,比如字体颜色,大小等等。message
:可选,指定操作表单的消息内容。只能通过Text
设置文本,不能再设置文本的样式,比如字体颜色,大小等等。buttons
:定义操作表单中的按钮选项,包括默认按钮(.default
)、破坏性按钮(.destructive
)和取消按钮(.cancel
)。- .
actionSheet
修饰符:将ActionSheet
绑定到视图,并根据isPresented
状态来控制显示与隐藏。
Alert、ActionSheet与enum的组合使用。
Alert与enum结合使用
当一个界面alert较多的时候,建议将所有错误类型方法enum
中定义,然后在点击的时候设置alert类型,如下代码,这里定义了alert类型,以及对应的Title
和Message
,Message
也支持设置类型的时候再传入。
enum AlertType {
case none
case success
case error(String, String)
var title: String {
switch self {
case .none:
return "Error"
case .success:
return "Success Alert"
case .error(let title, _):
return title
}
}
var message: String {
switch self {
case .none:
return "Error message"
case .success:
return "login successfully"
case .error(_, let message):
return message
}
}
}
最终代码和效果如下:
按照这种写法,一个界面再多的alert也能比较好的处理,UI上比较整洁,业务逻辑上也比较清晰明了。
ActionSheet与enum结合使用
如果一个界面需要弹出多个不同的操作列表,我们也可以像Alert
与enum
组合那样使用,自定义一个ActionSheetType
,分出几种类型,然后根据不同的类型定义Title
,Message
,以及需要显示哪些相关的Buttons
。这里就不再赘述了。
写在最后
本篇文章比较简单,主要介绍了Alert
和ActionSheet
的使用,希望能够帮助到有需要的朋友,如果觉得有帮助,还望点个赞,添加个关注,笔者也会不断地努力,写出更多更好用的文章。