つがる*_*つがる 3 dismiss ios swiftui
我是 Swift/SwiftUI 新手,想知道如何从嵌套子视图中消除模式/页面。
\n首先,我从 Flutter、UIHostingController、然后 SwiftUI 页面调用。(当前显示为模态...)
\n导航到 SwiftUI 后,我无法从子视图中使用 @environment 数据。
有什么办法可以做到这一点吗?\n提前致谢。
\nAppDelegate.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
\nstruct 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)\nChildView.swift
\nstruct 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)