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

相关推荐
zhongjiahao3 小时前
面试常问的 RunLoop,到底在Loop什么?
ios
wvy1 天前
iOS 26手势返回到根页面时TabBar的动效问题
ios
RickeyBoy1 天前
iOS 图片取色完全指南:从像素格式到工程实践
ios
aiopencode2 天前
使用 Ipa Guard 命令行版本将 IPA 混淆接入自动化流程
后端·ios
二流小码农2 天前
鸿蒙开发:路由组件升级,支持页面一键创建
android·ios·harmonyos
iceiceiceice3 天前
iOS PDF阅读器段评实现:如何从 PDFSelection 精准还原一个自然段
前端·人工智能·ios
TT_Close3 天前
【Flutter×鸿蒙】FVM 不认鸿蒙 SDK?4步手动塞进去
flutter·swift·harmonyos
张江3 天前
Swift Concurrency学习
swift
ssshooter4 天前
Tauri 踩坑 appLink 修改后闪退
前端·ios·rust
二流小码农4 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos