在上一章节中,我们已经学习了如何使用 NavigationStack 为用户提供页面间的导航。 本章将探讨另一种常见的内容展示方式——模态视图(Modal View)。
在 iOS 中,模态框常用于提示用户输入或显示新内容,例如创建提醒、填写表单等。 我们还会学习如何在模态视图中加入自定义悬浮按钮(Floating Button)以及如何使用 Alert 发出系统弹窗提示。
目录
- 什么是模态视图 (Modal View)
- Card 式模态的默认外观
- 使用
.sheet(isPresented:)
展示模态视图 - 使用可选绑定
.sheet(item:)
展示模态视图 - 在模态视图中添加悬浮按钮以便关闭
- 使用 Alerts 发出警告或提示
- 全屏模态视图:
.fullScreenCover
- 总结
- 完整示例代码
什么是模态视图 (Modal View)
模态视图在 iOS 中是一种将新内容或功能覆盖在当前界面之上 的展示方式, 它能阻止用户回到之前的内容,直到他们关闭该模态视图。
一般用于以下场景:
- 需要用户专注于当前任务(如填写表单或阅读重要通知)。
- 需要用户进行确认或输入才可继续(如新建日历事件、添加提醒)。
Card 式模态的默认外观
从 iOS 13 开始,系统默认使用卡片式(Card-like)呈现模态视图,而非覆盖全屏。 卡片会从屏幕底部向上滑入,并在顶部留出一部分主视图可见。 当用户完成查看或操作后,可通过下拉手势或关闭按钮来关闭卡片。
在 SwiftUI 中,我们可以使用 .sheet
修饰器来轻松实现这种卡片式模态视图。
使用 .sheet(isPresented:)
展示模态视图
基本用法
要使用 sheet(isPresented:)
,我们通常需要一个 @State
修饰的布尔值来控制模态视图是否显示。
例如:
.sheet(isPresented: $showModal) {
DetailView()
}
showModal
: 用于控制模态视图的展示 (true) 或隐藏 (false)。DetailView()
: 在模态视图中展示的具体内容。
实战演示
假设我们有一个文章列表,需要在用户点击文章时,以模态方式展示文章详情。
可以这样做:
-
在
ContentView
中添加一个布尔状态变量,和一个用于存储用户选中内容的selectedArticle
:@State var showDetailView = false
@State var selectedArticle: Article? -
在
List
的每个ArticleRow
中添加onTapGesture
,当用户点击时, 设置showDetailView = true
,并记录所选文章:.onTapGesture {
self.showDetailView = true
self.selectedArticle = article
} -
最后,使用
sheet(isPresented:)
进行模态 展示:.sheet(isPresented: $showDetailView) {
if let selectedArticle = self.selectedArticle {
ArticleDetailView(article: selectedArticle)
}
}
这样,当用户点击文章行时,就会弹出一张卡片式的模态视图,显示 ArticleDetailView
。