【发布时间】:2019-07-30 23:46:13
【问题描述】:
我正在尝试实现需要委托方法的功能(如NSUserActivity)。因此,我需要一个符合NSUserActivityDelegate(或类似的其他代表)的UIViewController,处理并保存所有必需的信息。我的问题是我的界面使用了 SwiftUI,因此我没有使用UIViewControllers。那么我怎样才能实现这个功能并且仍然使用 SwiftUI 作为 UI。我尝试过:view1 只是一个普通的 SwiftUI View,可以呈现(通过 NavigationLink)view2,这是想要实现此功能的视图。所以我尝试不链接 view1 和 view2,而是将 view1 链接到 UIViewControllerRepresentable,然后处理此功能的实现并将 UIHostingController(rootView: view2) 添加为子视图控制器。
struct view1: View {
var body: some View {
NavigationLink(destination: VCRepresentable()) {
Text("Some Label")
}
}
}
struct view2: View {
var body: some View {
Text("Hello World!")
}
}
struct VCRepresentable: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UIViewController {
return implementationVC()
}
func updateUIViewController(_ uiViewController: UIViewController, context: Context) { }
}
class implementationVC: UIViewController, SomeDelegate for functionality {
// does implementation stuff in delegate methods
...
override func viewDidLoad() {
super.viewDidLoad()
attachChild(UIHostingController(rootView: view2()))
}
private func attachChild(_ viewController: UIViewController) {
addChild(viewController)
if let subview = viewController.view {
subview.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(subview)
subview.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
subview.heightAnchor.constraint(equalTo: view.heightAnchor).isActive = true
subview.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
subview.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
}
viewController.didMove(toParent: self)
}
}
我在 VC 和 view2 之间传输数据时遇到问题。所以我想知道是否有更好的方法在 SwiftUI 视图中实现这样的功能。
【问题讨论】:
-
如果您的应用是
SwiftUI应用 - 听起来确实如此 - 那么您必须使用UIViewControllerRepresentable。没有它?您不能实现委托方法。现在,您可能会感到困惑 -UIHostingController是您反向操作的方式...向您的UIKit项目添加一个 SwiftUI 视图。这里(以及其他地方,包括 WWDC 视频)有相当不错的在 SwiftUI 项目中使用 UIViewController 的示例。我的建议是 (1) 在UIKit project first, then (2) expose it in a SwiftUI app - remember, a UIViewcontrollerRepresentable is just a SwiftUIView` 中工作。 -
很抱歉,我更正了我的代码:view1 链接到
UIViewControllerRepresentable,以便将UIViewController添加到我的应用程序以处理我的委托。因为我想在 SwiftUI 中做我的 UI,所以这个UIViewController附加了一个子 vc(见代码),它是一个UIHostingController,以便在 SwiftUI 视图中呈现 UI。我的问题是我无法真正在我的UIViewController(委托处理程序)和我的 SwiftUIView(view2)之间传递信息 -
UIHostingController仅在UIKit应用程序中使用。这就是您将 SwiftUIView带入 UIKit 的方式。基本上,您使用 eitherUIViewControllerRepresentable(UIKit >> SwiftUI) 或UIHostingController(SwiftUI >> UIKit。有关更多详细信息,请查看 Session 231: Integrating SwiftUI。 -
好的,我明白了。但是我如何处理 UIViewController 上的委托方法而不将其用作 UI 而是使用 view2(快速 UI 视图)?
-
我在我的 SwiftUI 项目中创建了三个
UIViewControllerRepresentables。 MTKView、UIImagePickerController 和 UIActivityViewController。其中两个使用委托(前两个)。我真的不确定他们是否能帮助你,但我愿意尝试。图像选择器背后的想法是 (a) 呈现它,(b) 使用委托方法来获取选择的图像或传递取消被按下的图像,以及 (c) 关闭它。它与我的模型相关联——从 beta 5 开始,它现在称为ObservableObject,并在更新应用程序状态时更新各种 SwiftUI 视图。这对你有帮助吗?