当我们在工作中,总会遇到弹出多个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