Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于macOS上SwiftUI的.sheet()或.popover()中的OnDiskAppear()不工作,是否有可靠的解决方法?_Macos_Swiftui - Fatal编程技术网

对于macOS上SwiftUI的.sheet()或.popover()中的OnDiskAppear()不工作,是否有可靠的解决方法?

对于macOS上SwiftUI的.sheet()或.popover()中的OnDiskAppear()不工作,是否有可靠的解决方法?,macos,swiftui,Macos,Swiftui,我正在构建一个应用程序,在iOS和macOS目标系统之间共享相当多的SwiftUI代码。在iOS上,onDisappear似乎可以在视图上可靠地工作。但是,在macOS上,如果视图位于工作表或弹出框内,则不会调用onDisappear 以下代码说明了该概念: import SwiftUI struct ContentView: View { @State private var textShown = true @State private var showSheet = fa

我正在构建一个应用程序,在iOS和macOS目标系统之间共享相当多的SwiftUI代码。在iOS上,
onDisappear
似乎可以在
视图上可靠地工作。但是,在macOS上,如果
视图
位于
工作表
弹出框
内,则不会调用
onDisappear

以下代码说明了该概念:

import SwiftUI

struct ContentView: View {
    @State private var textShown = true
    @State private var showSheet = false
    @State private var showPopover = false

    var body: some View {
        VStack {
            Button("Toggle text") {
                self.textShown.toggle()
            }
            if textShown {
                Text("Text").onDisappear {
                    print("Text disappearing")
                }
            }
            Button("Toggle sheet") {
                self.showSheet.toggle()
            }.sheet(isPresented: $showSheet, onDismiss: {
                print("On dismiss")
            }) {
                VStack {
                    Button("Close sheet") {
                        self.showSheet = false
                    }
                }.onDisappear {
                    print("Sheet disappearing")
                }
            }

            Button("Toggle popover") {
                self.showPopover.toggle()
            }.popover(isPresented: $showPopover) {
                VStack {
                    Text("popover")
                }.onDisappear {
                    print("Popover disappearing")
                }
            }
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
    }
}
请注意,
onDisappear
VStack
开头的
Text
组件上运行良好,但其他两个
onDisappear
调用不会在macOS上执行

我发现的一种解决方法是将一个
observegeObject
附加到
视图
中,并使用
deinit
调用清理代码。但是,这不是一个很好的解决方案,原因有二:

1) 以
popover
为例,在取消
popover
和deist调用之间有一个明显的延迟(尽管它在
工作表上运行得很快
) 2) 使用这种方法,我在macOS上没有遇到过任何崩溃,但在iOS上,
deinit
在SwiftUI中是不可靠的,除了琐碎的代码之外,其他任何操作都会发生崩溃——持有对我的数据存储、应用程序状态等的引用

以下是我用于
deinit
策略的基本方法:

class DeinitObject : ObservableObject {
    deinit {
        print("Deinit obj")
    }
}

struct ViewWithObservableObject : View {
    @ObservedObject private var deinitObj = DeinitObject()

    var body: some View {
        Text("Deinit view")
    }
}
此外,我本以为可以使用
工作表
调用的
onDismiss
参数,但在macOS上也不会调用该参数。而且,它不是
popover
的可用参数

所有这些都使用Xcode 11.4.1和macOS 10.15.3


有什么好的解决办法吗?

在iOS 13.3上遇到同样的问题;这是苹果公司的糟糕表现。