当咱们在工作中,总会遇到弹出多个Sheet的状况。弹出一两个的状况下,咱们能够运用绑定Boolean变量来完结。但是如果有很多种状况,会弹出很多种不同的Sheet咱们该怎么了来做呢?这便是咱们今天要解决的问题
绑定 Bool 值的办法
.sheet(isPresented: <#T##Binding<Bool>#>, content: <#T##() -> View#>)
这种办法当咱们有多个sheet要弹出时,就很麻烦。所以咱们建议运用下面办法来完结sheet的弹出,它具有更好的扩展性。
绑定Item办法
.sheet(
item: <#T##Binding<Identifiable?>#>,
content: <#T##(Identifiable) -> View#>)
它需求一个完成了 Identifiable 协议的 Binding 值。
咱们用一个 Model 来承载显现的内容,让model完成 Identifiable 协议。
model 如下:
struct ItemModel: Identifiable {
let id = UUID().uuidString
let title: String
}
在运用sheet的地方写上如下代码:
.sheet(item: $selectItemModel) { itemModel in
NextScreenView(itemModel: itemModel)
}
当你点击某个控件时,咱们需求改变 selectItemModel 的值。
Button("BUTTON (index)") {
selectItemModel = ItemModel(title: "(index)")
}
这样便是能够完成多个sheet弹出的作用。
以下是全部代码
// 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