SwiftUI:如何使用多个 Sheet

当我们在工作中,总会遇到弹出多个Sheet的情况。弹出一两个的情况下,我们可以使用绑定Boolean变量来完成。但是如果有很多种情况,会弹出很多种不同的Sheet我们该如何了来做呢?这就是我们今天要解决的问题

绑定 Bool 值的方法

SwiftUI 复制代码
.sheet(isPresented: <#T##Binding<Bool>#>, content: <#T##() -> View#>)

这种方法当我们有多个sheet要弹出时,就很麻烦。所以我们建议使用下面方法来完成sheet的弹出,它具有更好的扩展性。

绑定Item方法

SwiftUI 复制代码
.sheet(
item: <#T##Binding<Identifiable?>#>, 
content: <#T##(Identifiable) -> View#>)

它需要一个实现了 Identifiable 协议的 Binding 值。

我们用一个 Model 来承载显示的内容,让model实现 Identifiable 协议。

model 如下:

SwiftUI 复制代码
struct ItemModel: Identifiable {
    let id = UUID().uuidString
    let title: String
}

在使用sheet的地方写上如下代码:

SwiftUI 复制代码
.sheet(item: $selectItemModel) { itemModel in
  NextScreenView(itemModel: itemModel)
}

当你点击某个控件时,我们需要改变 selectItemModel 的值。

SwiftUI 复制代码
Button("BUTTON (index)") {
  selectItemModel = ItemModel(title: "(index)")
}

这样就是可以实现多个sheet弹出的效果。


以下是全部代码

SwiftUI 复制代码
// multiple sheets
struct ItemModel: Identifiable {
    let id = UUID().uuidString
    let title: String
}

struct MultipleSheetsSample: View {
    @State var selectItemModel: ItemModel? = nil
    
    var body: some View {
        ScrollView {
            VStack(spacing: 20) {
                ForEach(0..<20) { index in
                    Button("BUTTON (index)") {
                        selectItemModel = ItemModel(title: "(index)")
                    }
                }
            }
            .sheet(item: $selectItemModel) { itemModel in
                NextScreenView(itemModel: itemModel)
            }
        }
    }
}

struct NextScreenView: View {
    let itemModel: ItemModel
    var body: some View {
        Text(itemModel.title)
            .font(.largeTitle)
    }
}

大家有什么看法呢?欢迎留言讨论。

公众号:RobotPBQ

相关推荐
吴Wu涛涛涛涛涛Tao1 天前
基于TCA构建Instagram克隆:SwiftUI状态管理的艺术
ios·swiftui
2501_915921432 天前
iOS 应用上架多环境实战,Windows、Linux 与 Mac 的不同路径
android·ios·小程序·https·uni-app·iphone·webview
Cyclic10012 天前
IOS购买订阅通知信息解析说明Java
java·开发语言·ios
00后程序员张2 天前
iOS 应用上架常见问题与解决方案,多工具组合的实战经验
android·ios·小程序·https·uni-app·iphone·webview
HarderCoder3 天前
我们真的需要 typealias 吗?——一次 Swift 抽象成本的深度剖析
swift
HarderCoder3 天前
ByAI-Swift 6 全览:一份面向实战开发者的新特性速查手册
swift
HarderCoder3 天前
Swift 中 let 与 var 的真正区别:不仅关乎“可变”与否
swift
HarderCoder3 天前
深入理解 Swift 6.2 并发:从默认隔离到@concurrent 的完整指南
swift
2501_916007473 天前
iOS App 上架实战 从内测到应用商店发布的全周期流程解析
android·ios·小程序·https·uni-app·iphone·webview
wjm0410063 天前
ios八股文 -- Objective-c
开发语言·ios·objective-c