如何将关闭按钮从 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 呈现)分离到它自己的结构?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swiftUI 视图中使用按钮? [关闭]

如何从结构视图数组中提取状态? SwiftUI

SwiftUI - 如何将视图关闭到根目录,然后立即推送第二个视图?

SwiftUI - 如何关闭工作表视图,同时关闭该视图

将数据从模型传递到 SwiftUI 中的视图

SwiftUI:关闭第一个工作表时如何显示第二个工作表