SwiftUI - confirmationDialog在LazyVStack内部时具有异常行为

qni6mghb  于 2022-11-21  发布在  Swift
关注(0)|答案(1)|浏览(116)

我有一个ScrollView和一个LazyVStack,它有n个子视图。每个子视图都有一个按钮,它将显示一个确认对话框,确认对话框是在子视图中创建的。
在看到3个(或多或少)子视图后,确认对话框由于某种原因不起作用,你可以多次按下按钮,但不会立即显示对话框,如果你在滚动时等待,突然每个对话框都会一个接一个地弹出。
video testing
测试代码:

struct ContentView: View {
    var body: some View {
        ScrollView {
            LazyVStack(spacing: 50) {
                ForEach(0...100, id: \.self) { _ in
                    SubView()
                }
            }
        }
        .padding()
    }
}

struct SubView: View {
    
    @State var flag = false
    
    var body: some View {
        ZStack(alignment: .bottom) {
            RoundedRectangle(cornerRadius: 30)
                .frame(height: 500)
                .foregroundColor(.gray)
                .overlay {
                    Button("Press me") {
                        flag.toggle()
                    }
                    .confirmationDialog("", isPresented: $flag, actions: {
                        Button(role: .none) {
                           print("option 1")
                        } label: {
                            Text("option 1")
                        }
 
                        Button(role: .cancel) {
                            flag = false
                        } label: {
                            Text("cancel")
                        }
                    })
                }
        }
    }
}
fykwrbwg

fykwrbwg1#

进场

  • confirmationDialog移出LazyVStack

代码

struct ContentView: View {
    @State private var flag = false
    
    var body: some View {
        ScrollView {
            LazyVStack(spacing: 50) {
                ForEach(0...100, id: \.self) { _ in
                    SubView(flag: $flag)
                }
            }
            .confirmationDialog("", isPresented: $flag) {
                Button(role: .none) {
                    print("option 1")
                } label: {
                    Text("option 1")
                }
                
                Button(role: .cancel) {
                    flag = false
                } label: {
                    Text("cancel")
                }
            }
        }
        .padding()
    }
}

struct SubView: View {
    
    @Binding var flag: Bool
    
    var body: some View {
        ZStack(alignment: .bottom) {
            RoundedRectangle(cornerRadius: 30)
                .frame(height: 500)
                .foregroundColor(.gray)
                .overlay {
                    Button("Press me") {
                        flag.toggle()
                    }
                }
        }
    }
}

相关问题