如何从内部的 SwiftUI 视图返回到 UIKit?

Posted

技术标签:

【中文标题】如何从内部的 SwiftUI 视图返回到 UIKit?【英文标题】:How to go back from a SwiftUI View inside a to UIKit? 【发布时间】:2021-01-03 02:29:31 【问题描述】:

我在 HostingViewController 和 UIKit Viewcontroller 中有一个 SwiftUI。我的目标是通过按下按钮在它们之间切换。问题是我无法从 HostingViewController 中的 SwiftUI 视图返回 UIKit。

我可以使用这个 segue 函数通过我的 UIKit ViewController 转到 HostingViewController:

 @IBSegueAction func swiftUIAction(_ coder: NSCoder) -> UIViewController? 
        return UIHostingController(coder: coder, rootView: WorkoutSelectView())
    

我的尝试

可是我不知道怎么回去。我使用了一个解决方案,在这里我从我的 SwiftUI 视图的 AppDelegate 调用一个函数:

 guard let appDelegate: AppDelegate = UIApplication.shared.delegate as? AppDelegate else  return 
 appDelegate.switchBack()

在 Appdelegate 内部我有这个功能:

 func switchBack()
        guard var rootViewController = (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.window?.rootViewController else 
                  return
        
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let controller = storyboard.instantiateViewController(withIdentifier: "Home") as! HomeViewController
        rootViewController.present(controller, animated: true, completion:  () -> Void in
        
        )
    

这很酷,但问题是:

<WorkoutTracker.HomeViewController: 0x148f072a0>) whose view is not in the window hierarchy.

那么你有什么想法吗?

【问题讨论】:

【参考方案1】:

可能的方法是将完成回调传递到您的 SwiftUI 视图中,如下面的简化演示中所示

struct WorkoutSelectView: View 
    var completion: () -> () = 

    var body: some View 
        Button("Close", action: completion)
    

并在您的 UIViewController 中使用此回调来关闭呈现的控制器,例如

@IBSegueAction func swiftUIAction(_ coder: NSCoder) -> UIViewController? 
   let controller =  UIHostingController(coder: coder, 
        rootView: WorkoutSelectView()  [weak self] in
           self?.dismiss(true)
        )
   return controller

【讨论】:

以上是关于如何从内部的 SwiftUI 视图返回到 UIKit?的主要内容,如果未能解决你的问题,请参考以下文章

从目标视图返回时,SwiftUI NavigationLink 显示为突出显示

如何使用 SwiftUI 拨打电话 [重复]

在父 swiftui 视图中,我如何知道内部视图 viewmodel void 方法中的状态何时发生变化?

从一个 SwiftUI 视图移动到另一个

在列表中加载 WebView 而无需重新加载 webView 内容 SwiftUI

如何从 SwiftUI 视图转到 UIKit TabViewController?