SwiftUI for macOS - 触发 sheet .onDismiss 问题

SwiftUI for macOS - trigger sheet .onDismiss problem

在多平台应用程序中,我展示了一个 sheet 来收集少量用户输入。在 iOS 上,当 sheet 被关闭时,会调用相关的 .onDismiss 方法,但在 macOS 上不会。

我读到在 List 中使用 .onDismiss 会导致问题,所以我将它附加到按钮本身但没有改进。我也尝试过传递 isPresented 绑定并在 sheet 本身内切换它以关闭它,但同样没有成功。

我正在使用 NavigationView 但删除它没有任何区别。下面的简化示例演示了我的问题。有任何想法吗?我什至应该在 macOS 上为此目的使用 sheet 吗?

我只是想说明一下,关闭 sheet 没有问题。我发现的其他问题是关于关闭 sheet 的问题 - 我可以做到。

import SwiftUI

@main
struct SheetTestApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

struct ContentView: View {
    var body: some View {
        NavigationView {
            ListView()
        }
    }
}

列表视图。

struct ListView: View {
    
    @State private var isPresented: Bool = false
    
    var body: some View {
        VStack {
            Text("Patterns").font(.title)
            
            Button(action: {
                isPresented = true
            }, label: {
                Text("Add")
            })
            .sheet(isPresented: $isPresented, onDismiss: {
                doSomethingAfter()
            }) {
                TestSheetView()
            }
            
            List {
                Text("Bingo")
                Text("Bongo")
                Text("Banjo")
            }
            .onAppear(perform: {
                doSomethingBefore()
            })
        }
    }
    
    func doSomethingBefore() {
        print("Johnny")
    }
    
    func doSomethingAfter() {
        print("Cash")
    }
}

这是 sheet 视图。

struct TestSheetView: View {
    
    @Environment(\.presentationMode) var presentationMode
    
    @State private var name = ""
    
    var body: some View {
        Form {
            TextField("Enter name", text: $name)
                .padding()
            
            HStack {
                Spacer()
                Button("Save") {
                    presentationMode.wrappedValue.dismiss()
                }
                Spacer()
            }
        }
        .frame(minWidth: 300, minHeight: 300)
        .navigationTitle("Jedward")
    }
}

坏问题..你是对的。不调用 OnDismiss。这是 Proxybinding

的解决方法
var body: some View {
    VStack {
        Text("Patterns").font(.title)
        
        Button(action: {
            isPresented = true
        }, label: {
            Text("Add")
        })
        
        List {
            Text("Bingo")
            Text("Bongo")
            Text("Banjo")
        }
        .onAppear(perform: {
            doSomethingBefore()
        })
    }
    .sheet(isPresented: Binding<Bool>(
            get: {
                isPresented
            }, set: {
                isPresented = [=10=]
                if ![=10=] {
                    doSomethingAfter()
                }
            })) {
        TestSheetView()
    }
}