swift - 如何从 SwiftUI 视图导航到 UIKit UIViewController
问题描述
到目前为止,我有一个完全使用 UIKit 构建的应用程序。但是,我希望能够开始实现一些 SwiftUI 视图来替换一些 UIViewController。
我已经能够通过点击按钮从 UIViewController 导航到 SwiftUI 视图:
@IBAction func buttonTapped(_ sender: Any) {
let newView = UIHostingController(rootView: SwiftUIView(viewObj: self.view, sb: self.storyboard, dismiss: self.dismiss) )
view.window?.rootViewController = newView
view.window?.makeKeyAndVisible()
}
我的问题是,我将如何从单个 SwiftUI 视图转换到 UIViewController?(因为应用程序的其余部分在 UIKit 中)?我在 SwiftUI 视图中有一个按钮,可以在点击时导航回 UIViewController。我试过了:
view
将和对象传递storyboard
给 SwiftUI 视图,然后调用执行与上述代码类似的操作来更改当前视图控制器。但是,在模拟器上尝试时没有任何反应。- 用于以
.present
模态方式显示 SwiftUI 视图。这行得通,我可以允许 SwiftUI 视图.dismiss
本身。但是,这仅在模态下有效,我希望使其正常工作(即更改屏幕)
这是我的简单 SwiftUI 视图:
struct SwiftUIView: View {
var viewObj:UIView? // Perhaps use this for transition back?
var sb:UIStoryboard?
var dismiss: (() -> Void)?
var body: some View {
Button(action: {
// Do something here to Transition
}) {
Text("This is a SwiftUI view.")
}
}
}
我无法理解如何正确地将 SwiftUI 集成到 UIKit中,而不是相反,我不确定是否UIViewControllerRepresentable
是这个问题的答案。非常感谢对此的任何解决方案、替代方案或有用的知识。再次感谢!
解决方案
再见,
我试图通过使用闭包回调来遵循您的方法。
struct SwiftUIView: View {
var dismiss: (() -> Void)?
var present: (()->Void)?
var body: some View {
VStack(spacing: 20) {
Button(action: {
self.dismiss?()
}) {
Text("Dismiss me")
}
Button(action: {
self.present?()
}) {
Text("Present some UIViewController")
}
}
}
}
当你展示你的 UIHostingController 时,你想要实现 2 个闭包回调:
@IBAction func buttonTapped(_ sender: Any) {
let hostingController = UIHostingController(rootView: SwiftUIView())
hostingController.rootView.dismiss = {
hostingController.dismiss(animated: true, completion: nil)
}
hostingController.rootView.present = {
let destination = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(identifier: "VC_TO_PRESENT")
hostingController.present(destination, animated: true, completion: nil)
}
present(hostingController, animated: true, completion: nil)
}
推荐阅读
- python - 读取多个文件但在 python 中对一个文件执行摘要的优雅方式
- c - 如何为旧的 Visual Studio 2005 转换 C 代码,尤其是 TinyExpr 源代码
- c# - 再次开始改变颜色
- jmeter - 无论如何传递HTTP采样器的响应以请求作为JMETER中的另一个采样器
- python - 尝试使用 Flask 中的渲染模板重定向到另一个 HTML 页面
- python - 检查输入时出错:预期输入为 3 维,但得到的数组形状为 (50, 1)
- python - 如何使用熊猫从csv中的2列中获取重复值列表
- .htaccess - 如何将此 htaccess 转换为 iis web.config?
- python - 自动从分组数据框中创建新数据框
- firebase - 函数执行耗时 60002 毫秒,完成状态为:可调用函数的“超时”