我遇到了呈现弹出框然后尝试呈现表格的问题。该表无法呈现。
我准备了一个显示两个按钮的简短代码
- 第一个在其自身上呈现一个弹出窗口(“单击此按钮”)
- 第二个呈现一张纸(“然后这个按钮”)
重现步骤
--- 可在 iPad 上重现 ---
- 单击第一个按钮,会出现一个弹出窗口
- 当弹出窗口可见时,直接单击第二个按钮。
(不以任何其他方式关闭弹出窗口)
状态:弹出窗口已关闭,但未显示工作表。并且不可能使用第二个按钮来呈现它。不过,弹出按钮仍然有效。
Error
以下消息正在打印到控制台:
[Presentation] Attempt to present <_TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView_: 0x10bc13cf0>
on <_TtGC7SwiftUI19UIHostingControllerV10AppBuilder8RootView_: 0x105a093f0>
(from <_TtGC7SwiftUI19UIHostingControllerV10AppBuilder8RootView_: 0x105a093f0>)
which is already presenting <_TtGC7SwiftUI29PresentationHostingControllerVS_7AnyView_: 0x10ba170a0>.
Code
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()是一个有效的解决方案,因为它引入了另一个错误。您需要多次按下按钮才能做出反应。
我在工作表和警报方面也遇到了类似的问题。关键是,SwiftUI 一次只能呈现一个模式。 showSheet 标志不适合检查工作表是否实际上仍然存在:当它设置为 false 时,仍然需要一些时间才能不再显示工作表(我想是因为动画)。我通过引入一个指示工作表仍然存在的附加标志在视图中解决了这个问题。该标志在以下范围内设置为 true/falseonAppear
and onDismiss
工作表的各个部分。在计算警报的标志(计算属性)时,我会考虑这个附加标志。
希望这个问题能够在 SwiftUI 的未来版本中得到解决。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)