SwiftUI,从子视图中关闭模式/页面

つがる*_*つがる 3 dismiss ios swiftui

我是 Swift/SwiftUI 新手,想知道如何从嵌套子视图中消除模式/页面。

\n

首先,我从 Flutter、UIHostingController、然后 SwiftUI 页面调用。(当前显示为模态...)
\n导航到 SwiftUI 后,我无法从子视图中使用 @environment 数据。

\n

有什么办法可以做到这一点吗?\n提前致谢。

\n

AppDelegate.swift

\n
@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n    override func application(\n        _ application: UIApplication,\n        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n    ) -> Bool {\n        let controller : FlutterViewController = self.window?.rootViewController as! FlutterViewController\n        let channel = FlutterMethodChannel.init(name: "com.example.show", binaryMessenger: controller.binaryMessenger)\n        channel.setMethodCallHandler({\n            (call, result) -> Void in\n            if call.method == "sample" {\n                let vc = UIHostingController(rootView: ContentView())\n                vc.modalPresentationStyle = .fullScreen\n                controller.present(vc, animated: true,completion: nil)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n
Run Code Online (Sandbox Code Playgroud)\n

内容视图.swift

\n
struct ContentView: View{\n    @Environment(\\.presentationMode) var presentation: Binding<PresentationMode>\n    private var childView: ChildView()\n\n    var body: some View{\n        NavigationView{\n            ZStack{\n                childView\n                Button(action: {\n// This works ************************\n                    self.presentation.wrappedValue.dismiss()\n                }, label: {\n                    Text("close")\n                })\n            }\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

ChildView.swift

\n
struct ChildView: View{\n    @Environment(\\.presentationMode) var presentation: Binding<PresentationMode>\n\n    var body: some View{\n        Button(action: {\n// This won't do anything *********************************\n            self.presentation.wrappedValue.dismiss()\n// nor this\xe2\x86\x93 **********************************************\n            if #available(iOS 15.0, *) {\n               @Environment(\\.dismiss) var dismiss;\n                dismiss()\n                dismiss.callAsFunction()\n            }\n            }, label: {\n                Text("close")\n            })\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

小智 6

对于 iOS 15.0 及更高版本,我们可以使用新的环境值dismiss,并且为了与子视图一起使用,我们还应该将其从父视图传递到子视图:

内容视图.swift

struct ContentView: View {
    @Environment(\.dismiss) private var dismiss

    var body: some View {
        NavigationView {
            ZStack {
                ChildView(parentDismiss: dismiss)
                Button {
                    dismiss()
                } label: {
                    Text("close")
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ChildView.swift

struct ChildView: View {
    let parentDismiss: DismissAction

    var body: some View {
        Button {
            parentDismiss()
        } label: {
            Text("Close")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)