我有一个使用 hostingController 呈现的 swiftUI 视图:
let hostingController = UIHostingController(rootView: FirstView)
someVC.present(hostingController, animated: true)
FirstView 反过来使用 .sheet(IsPresented 和布尔值来呈现第二个 SwiftUI 视图,以确定是否应按如下方式显示它:
struct FirstView: View {
@Environment(\.presentationMode) var presentationMode
@State var showSecondView = false
//change showSecondView to true so it displays as a sheet
.sheet(isPresented: $showSecondView) {
SecondView()
}
}
在 SecondView 中,我想用一个按钮同时关闭 SecondView 和 FirstView。这个按钮可以关闭 SecondView,但我不知道如何同时关闭 FirstView,因为 FirstView 是在托管控制器中呈现的,没有使用布尔值。
如果 SecondView 是 First View 中的警报,那么我可以使用环境变量 presentationMode 来消除,但是,该变量似乎无法从 SecondView 访问。
struct SecondView: View {
@Environment(\.dismiss) var dismiss
Button("OK") {
//THIS DOES NOT WORK BECAUSE presentationMode is out of scope
presentationMode.wrappedValue.dismiss()
dismiss()//
}
}
我怎样才能不仅关闭当前(或第二)工作表,而且还关闭在 hostingController 中呈现的呈现(或第一视图)。
提前感谢任何建议。
有时你会传递一个动作闭包,例如
有时闭包包含一些你想要传回的数据,例如
当您初始化托管控制器的根视图时,您可以使用相同的技术回调 UIKit。
SecondView 是作为 SwiftUI 视图表创建的 - 它由 SwiftUI 内部管理,可以使用 @Environment(\.dismiss) 来关闭。
但是 FirstView 是通过 UIKit(UIHostingController)托管的,因此必须通过 UIKit(someVC.dismiss(...))来关闭它,而如果没有桥接器,则无法从深度嵌套的 SwiftUI 视图中自动完成此操作。
以下是一个建议:
让我们创建一个 ObservableObject,以便我们可以用类似的方法来管理环境对象:
将其添加到将添加到 UIHostingController 的视图中:
引用环境对象并在需要的地方执行 dismiss 方法: