0

我正在用一个按钮展示和关闭一个 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
       }) {}
}
4

1 回答 1

0

SwiftUI 没有手动滚动您自己的解除操作并将其传入,而是通过环境变量提供了自己的解除操作。我还没有在托管控制器的基础上使用它,但相反没有看到任何迹象表明它不起作用...... (编辑:已经仔细检查并且绝对适用于包装在 aUIHostingController并通过呈现的 SwiftUI 视图UIViewController.present(_:animation:completion:).)

一般的做法是:

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")
    }
  }
}

于 2021-12-08T18:23:26.330 回答