我正在尝试实现一项需要委托方法的功能(类似于NSUserActivity
)。因此,我需要一个符合NSUserActivityDelegate
(或其他类似委托)协议的UIViewController
,处理和保留所有所需信息。我的问题是,我正在使用SwiftUI进行界面设计,因此没有使用UIViewControllers
。那么,我该如何实现这个功能并仍然使用SwiftUI进行界面设计呢?我尝试过的方法:view1只是一个普通的SwiftUI View
,可以通过NavigationLink
呈现view2,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 View中实现这样的功能。
SwiftUI
应用程序 - 而且看起来确实是这样 - 那么您 必须 使用UIViewControllerRepresentable
。没有它?您将无法实现委托方法。现在,您可能会感到困惑 -UIHostingController
是如何反向操作的...将 SwiftUI 视图添加到您的UIKit
项目中。这里(以及其他地方,包括 WWDC 视频)有相当不错的示例说明了如何在 SwiftUI 项目中使用 UIViewController。我的建议是:(1)在UIKit
项目中首先让某些东西工作,然后(2)在 SwiftUI 应用程序中公开它 - 记住,UIViewcontrollerRepresentable
只是一个 SwiftUIView
。 - user7014451UIViewControllerRepresentable
,以便向我的应用程序添加一个UIViewController
来处理我的委托。由于我想在SwiftUI中进行UI设计,因此这个UIViewController
会附加一个子vc(请参见代码),它是一个UIHostingController
,以便在SwiftUI视图中呈现UI。我的问题是,我无法真正在我的UIViewController
(委托处理程序)和我的SwiftUIView
(view2)之间传递信息。 - l30c0d35UIHostingController
仅在UIKit
应用程序中使用。这是将 SwiftUI 的View
带入 UIKit 的方法。基本上,您可以使用UIViewControllerRepresentable
(UIKit >> SwiftUI)或UIHostingController
(SwiftUI >> UIKit)。有关更多详细信息,请查看第 231 会话:集成 SwiftUI。 - user7014451UIViewControllerRepresentable
。MTKView,UIImagePickerController和UIActivityViewController。它们中的两个使用委托(前两个)。我真的不确定它们是否能帮助你,但我愿意尝试。图像选择器的想法是(a)展示它,(b)使用委托方法来获取所选图像或传递取消按钮被按下的信息,然后(c)将其解除显示。它与我的模型相关联 - 从beta 5开始现在称为“ObservableObject”,并在应用程序状态更新时更新各种SwiftUI视图。这有助于您吗? - user7014451