我遇到了一个问题,提出了一个波波夫,然后试图提出一张床单。这张纸不能出示。
我准备了一个显示两个按钮的简短代码
复制步骤
--可在iPad上复制--
单击第一个按钮,presented
错误
正在将下列消息打印到控制台:
[Presentation] Attempt to present <_TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView_: 0x10bc13cf0>
on <_TtGC7SwiftUI19UIHostingControllerV10AppBuilder8RootView_: 0x105a093f0>
(from <_TtGC7SwiftUI19UIHostingControllerV10AppBuilder8RootView_: 0x105a093f0>)
which is already presenting <_TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView_: 0x10ba170a0>.
代码
import SwiftUI
struct MyView: View {
@State var showSheet: Bool = false
struct SomeDeepView: View {
@State var showPopover: Bool = false
var body: some View {
Button {
showPopover = true
} label: {
Text("Click this button")
}
.popover(isPresented: $showPopover) {
Text("Popover content")
}
}
}
var body: some View {
VStack(spacing: 64) {
SomeDeepView()
Button {
showSheet = true
} label: {
Text("Then this button")
}
}
.sheet(isPresented: $showSheet) {
Text("Sheet content")
}
.frame(width: 500, height: 500, alignment: .center)
}
}
我的思想
MyView不应该关心SomeDeepView的内部内容。而且,SomeDeepView不应该太在意它的外部/父母。然而,我们不能同时展示一个爆米花和一张床单。我会接受这一点,因为我知道框架会处理这个问题,不会崩溃。然而,它确实会破裂。意外的副作用:通过更改,showSheet不再能够显示工作表。
任何想法和想法都是非常受欢迎的。谢谢
Edit1:我不认为toggle()是一种有效的解决方法,因为它引入了另一个bug。在它做出反应之前,你需要多次按下按钮。
发布于 2022-03-10 16:33:52
如果您将showSheet = true
更改为showSheet.toggle()
,则工作表将在第三次传递第二个按钮时显示。
除此之外,我猜您必须手动检查,当打开打开时,不能打开工作表.
https://stackoverflow.com/questions/71425496
复制相似问题