fatbobman / blogComments

1 stars 0 forks source link

在 SwiftUI 中,根据需求弹出不同的 Sheet | 肘子的Swift记事本 #98

Open fatbobman opened 3 years ago

fatbobman commented 3 years ago

https://fatbobman.com/posts/swiftui-multiSheet/

Sheet 是一个我比较喜欢的交互形式,它可以很好的控制用户的操作行为,让用户的交互逻辑单线条化。在 iOS14 上,SwiftUI 增加了 fullCover,支持了全屏的 Sheet 方式,让开发者又了更多的选择。

pomeloL commented 6 months ago

肘子兄,你好 关于“解决某些 View 无法激活 Sheet 的问题” ,如果界面很复杂,都bind 它的父 View 的 sheetAction比较难看, 我在overflow上看见可以在当前view加一个onchange解决这个问题,但是这样子会造成dismiss的时候动画消失

fatbobman commented 6 months ago

@pomeloL 好像在新版本 SwiftUI 中,无法激活 sheet 的情况会少一些。总体来说,如果不想集中管理,就只能用一个 workround 来处理。

Mamong commented 1 month ago

发现一个问题:

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一下午排查和复现该问题,人都快麻了。

fatbobman commented 1 month ago

@Mamong 在 SwiftUI 中,将 sheet 放在 toolbar 外确实容易出现一些奇怪的情况。Menu 尤其容易出问题(直到现在)。 这篇文章太老了。我现在建议将 sheet 放在一个稳定的容器外面,即使是 ForEach 中也最好不要安放。