SwiftUI - 从SwiftUI中呈现ViewController/TableViewController

3

该应用仍然大量使用ViewControllers和TableViewController,这使得集成SwiftUI变得困难。

首先,我正在从一个ViewController中呈现一个SwiftUI视图。

class SwiftUIViewController : UIViewController {

    let contentView = UIHostingController(rootView: SwiftUIView())

    override func viewDidLoad() {
        super.viewDidLoad()
    
        view.addSubview(contentView.view)
    }
}

现在,从我的 SwiftUIView 中,我需要启动 ViewControllers 和 TableViewControllers。 我创建了一个注入器类,可用于 .sheet,以从 SwiftUI 显示视图控制器。

struct ViewControllerInjector : UIViewControllerRepresentable {

    let viewController: UIViewController

    func makeUIViewController(context: Context) -> UIViewController {
        return viewController
    }
    func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
    
    }
}

现在这个方法可以工作,唯一的问题是我似乎找不到一个方法来呈现ViewController而不是一个.sheet。

struct SwiftUIView : View {
    @State private var showingVC1 = false
    ...

    .sheet(isPresented: $showingVC1) {
        ViewControllerInjector(viewController: ViewController1())
    }

    ...
}

我希望完全离开SwiftUI屏幕,并继续使用视图控制器,直到我按下返回按钮并返回到SwiftUI屏幕。此外,即使我创建了一个专门用于TableView的第二个注入器类,注入器似乎也无法与TableViewControllers一起使用。
这种类型的导航是否可行?如果有任何不清楚的地方,请随时留言。谢谢。

可能不会有太大的帮助,但感觉你希望简化。将近18个月前(哇!)我开始使用SwiftUI,并且需要一个东西 - 一个带有两个UITableView的UINavigationView来进行导航。SwiftUI当时还非常原始,以至于当我需要在第一个UITableView的导航栏中添加一个编辑按钮时,我不得不使用一个“可表示对象”。直到我发现我还需要它用于图像选择器、共享面板和侧滑菜单时,我才干脆放弃了。UIKit在未来十年甚至二十年都不会消失。我的建议是,不要试图做太多。坚持选择正确的应用程序“基础”。 - user7014451
FYI,我成功地将整个UIKit部分(包括导航控制器、两个表视图和第一个可编辑的表视图)作为UIViewControllerRepresentable实现。只是在那之后,我放弃了SwiftUI。(暂时放弃)我认为这可能是我认为我可以像你所说的那样做一些事情的部分 - 将UIKit嵌入到SwiftUI中,或者反过来,然后再嵌入另一个组件。老实说,我建议你简化事情。记住,总有一天你或其他人将不得不接手维护这段代码。 - user7014451
1个回答

0

问题是.sheet是一个模态视图,您希望它全屏显示吗?在这种情况下,请尝试将.sheet替换为.fullScreenCover

要在SwiftUI中呈现TableViewController,请尝试将UIViewController切换为UITableViewController或UITableView。以下是我之前在这里找到的代码片段:

struct UITableViewRepresentable: UIViewRepresentable {

    func makeUIView(context: Context) -> UITableView {
   
        uiTableView.dataSource = context.coordinator
        uiTableView.delegate = context.coordinator

        }

        uiTableView.register(HostingCell.self, forCellReuseIdentifier: "Cell")
        return uiTableView
    }

    func updateUIView(_ uiTableView: UITableView, context: Context) {}

    func makeCoordinator() -> Coordinator {
        return Coordinator(self)
    }

    class HostingCell: UITableViewCell { // just to hold hosting controller
        var host: UIHostingController<AnyView>?
    }

    class Coordinator: NSObject, UITableViewDelegate, UITableViewDataSource {

        init(_ parent: UITableViewRepresentable) {
           
        }

        func numberOfSections(in tableView: UITableView) -> Int {
            return self.parent.items.keys.count
        }

        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return parent.items[section]?.count ?? 0
        }

        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
           
          
            return tableViewCell
        }

        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
          
        }

非常感谢您的回答,先生。我一定会尝试这个方法。 - SomeKoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接