如何将关闭按钮从 swiftui 视图的主结构(由 uihostingviewcontroller 呈现)分离到它自己的结构?
Posted
技术标签:
【中文标题】如何将关闭按钮从 swiftui 视图的主结构(由 uihostingviewcontroller 呈现)分离到它自己的结构?【英文标题】:How to separate a dismiss button from the main struct of a swiftui view (that is presented by a uihostingviewcontroller) to its own struct? 【发布时间】:2022-01-13 15:59:32 【问题描述】:我正在展示和关闭一个带有按钮的 swiftUI 视图,它工作正常。
swiftUI 视图:
struct SmartG_SwiftUI: View
var dismissAction: (() -> Void)
var body: some View
Button(action:
dismissAction()
)
我正在展示来自 UIKit 的 SwiftUI 视图控制器,这样:
let hostingVC = UIHostingVC(rootView: SmartG_SwiftUI(dismissAction:
vc?.dismiss( animated: true, completion: nil )
))
vc?.present(hostingVC, animated: true, completion: nil)
我的问题是,我怎么能把这个按钮放在一个单独的结构中?所以为了得到类似的东西:
struct SmartG_SwiftUI: View
var dismissAction: (() -> Void)
Header()
struct Header: View
Button(action:
dismissAction() //unknown here
)
【问题讨论】:
【参考方案1】:SwiftUI 没有手动滚动您自己的解除操作并将其传入,而是通过环境变量提供了自己的解除操作。我还没有在主机控制器基础上使用过它,但相反地,没有看到任何迹象表明它不起作用 ... (编辑:仔细检查并且肯定有效对于包装在 UIHostingController
中并通过 UIViewController.present(_:animation:completion:)
呈现的 SwiftUI 视图。)
一般做法是:
struct MyView: View
@Environment(\.dismiss) var dismiss
var body: some View
Button
dismiss()
label:
Text("Close")
但这不一定是主机控制器的最顶层视图;因为解除操作在环境中,所以它也可以在您的 Header
视图中使用。
请注意,对于 ios 13 或 14,语法有点冗长:
struct MyView: View
@Environment(\.presentationMode) var presentationMode
var body: some View
Button
presentationMode.wrappedValue.dismiss()
label:
Text("Close")
【讨论】:
这很好用,谢谢。这要容易得多。我还尝试将按钮放在一个单独的结构中,并在顶部使用该 presentationMode 变量,它也可以工作。视图被解雇了,我不知道如何检查它是否被释放,但我猜它确实被释放了。以上是关于如何将关闭按钮从 swiftui 视图的主结构(由 uihostingviewcontroller 呈现)分离到它自己的结构?的主要内容,如果未能解决你的问题,请参考以下文章