对于macOS上SwiftUI的.sheet()或.popover()中的OnDiskAppear()不工作,是否有可靠的解决方法?
我正在构建一个应用程序,在iOS和macOS目标系统之间共享相当多的SwiftUI代码。在iOS上,对于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
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上遇到同样的问题;这是苹果公司的糟糕表现。