我正在尝试设置一个视图,它可以根据点击的按钮显示多个模态。
当我只添加一个sheet时,一切都正常:
.sheet(isPresented: $showingModal1) { ... }但是当我添加另一个工作表时,只有最后一个工作表有效。
.sheet(isPresented: $showingModal1) { ... }
.sheet(isPresented: $showingModal2) { ... }更新
我试图让它正常工作,但我不确定如何为modal声明类型。我收到一个Protocol 'View' can only be used as a generic constraint because it has Self or associated type requirements的错误。
struct ContentView: View {
@State var modal: View?
var body: some View {
VStack {
Button(action: {
self.modal = ModalContentView1()
}) {
Text("Show Modal 1")
}
Button(action: {
self.modal = ModalContentView2()
}) {
Text("Show Modal 2")
}
}.sheet(item: self.$modal, content: { modal in
return modal
})
}
}
struct ModalContentView1: View {
var body: some View {
Text("Modal 1")
}
}
struct ModalContentView2: View {
var body: some View {
Text("Modal 2")
}
}发布于 2019-09-10 22:48:13
我个人会模仿一些NavigationLink应用编程接口。然后,您可以创建一个hashable枚举,并决定要呈现哪个模式表。
extension View {
func sheet<Content, Tag>(
tag: Tag,
selection: Binding<Tag?>,
content: @escaping () -> Content
) -> some View where Content: View, Tag: Hashable {
let binding = Binding(
get: {
selection.wrappedValue == tag
},
set: { isPresented in
if isPresented {
selection.wrappedValue = tag
} else {
selection.wrappedValue = .none
}
}
)
return background(EmptyView().sheet(isPresented: binding, content: content))
}
}
enum ActiveSheet: Hashable {
case first
case second
}
struct First: View {
var body: some View {
Text("frist")
}
}
struct Second: View {
var body: some View {
Text("second")
}
}
struct TestView: View {
@State
private var _activeSheet: ActiveSheet?
var body: some View {
print(_activeSheet as Any)
return VStack
{
Button("first") {
self._activeSheet = .first
}
Button("second") {
self._activeSheet = .second
}
}
.sheet(tag: .first, selection: $_activeSheet) {
First()
}
.sheet(tag: .second, selection: $_activeSheet) {
Second()
}
}
}https://stackoverflow.com/questions/57103800
复制相似问题