Open fatbobman opened 3 years ago
肘子兄,你好 关于“解决某些 View 无法激活 Sheet 的问题” ,如果界面很复杂,都bind 它的父 View 的 sheetAction比较难看, 我在overflow上看见可以在当前view加一个onchange解决这个问题,但是这样子会造成dismiss的时候动画消失
@pomeloL 好像在新版本 SwiftUI 中,无法激活 sheet 的情况会少一些。总体来说,如果不想集中管理,就只能用一个 workround 来处理。
发现一个问题:
struct Test: View {
@State private var present = false
var body: some View {
return VStack {
Button("open") {
present = true
}
}
.toolbar {
ToolbarItem {
// Button("open") {
// present = true
// }
Menu {
Button("sample", action: {
present = true
})
} label: {
Image(systemName: "curlybraces")
}
}
}
.sheet(isPresented: $present) {
print("=====show sheet")
return Text("sheet")
}
.navigationTitle("test")
}
}
这段代码在点击Button的时候,sheet里content会执行多次,而且手动dismiss sheet也会执行content。当且仅当.toolbar { ToolbarItem { Menu {}}}.sheet的时候才会发生,如果把Menu换成Button,或者把.sheet移到.toolbar之前都不会发生这个问题。环境iOS16+Xcode14。花了y一下午排查和复现该问题,人都快麻了。
@Mamong 在 SwiftUI 中,将 sheet 放在 toolbar 外确实容易出现一些奇怪的情况。Menu 尤其容易出问题(直到现在)。 这篇文章太老了。我现在建议将 sheet 放在一个稳定的容器外面,即使是 ForEach 中也最好不要安放。
https://fatbobman.com/posts/swiftui-multiSheet/
Sheet 是一个我比较喜欢的交互形式,它可以很好的控制用户的操作行为,让用户的交互逻辑单线条化。在 iOS14 上,SwiftUI 增加了 fullCover,支持了全屏的 Sheet 方式,让开发者又了更多的选择。