【问题标题】:SwiftUI - Presenting a ViewController/TableViewController from SwiftUISwiftUI - 从 SwiftUI 呈现 ViewController/TableViewController
【发布时间】:2021-01-11 19:26:38
【问题描述】:

该应用仍然大量使用 ViewControllers 和 TableViewControllers,这使得集成 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())
    }

    ...
}

我想完全离开 swift ui 屏幕并继续使用视图控制器,直到我按下后退按钮并返回 SwiftUI 屏幕。此外,即使我创建了第二个专用于 TableView 的注入器类,注入器似乎也无法与 TableViewControllers 一起使用。

这种导航方式可行吗?如果有任何不清楚的地方,请随时发表评论。谢谢

【问题讨论】:

  • 可能不会有太大帮助,但感觉就像您希望简化。差不多 18 个月前(哇!)我购买了 SwiftUI 并且需要一些东西 - 一个 UINavigationView 和两个 UITableViews 之间导航。 SwiftUI 是 so 原始的,当我需要在导航中为第一个 UITableView 添加一个编辑按钮时,我求助于“可表示”。直到我发现我需要一个图像选择器、一个共享表和一个幻灯片后,我才干脆放弃了。 UIKit 在十年内不会去任何地方,也许是两年。我的建议,不要尝试太多。坚持为应用使用正确的 base
  • 仅供参考,我所做的工作是将整个 UIKit 部分 - 一个导航控制器、两个表视图、第一个可编辑 - 作为 UIViewControllerRepresentable。直到那之后我才放弃了 SwiftUI。 (目前。)我认为这是我认为也许我可以像您所说的那样的部分 - 将 UIKit 嵌入到 SwiftUI 中,反之亦然,而不是使用您正在嵌入的组件,嵌入另一个。老实说,我建议您将事情简化。请记住,有一天您或其他人将不得不获取此代码进行维护。

标签: ios swift swiftui navigation


【解决方案1】:

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

要在 SwiftUI 中呈现 TableViewController,请尝试将 UIViewController 切换为 UITableViewController 或 UITableView。这是我前段时间在这里找到的代码sn-p:

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) {
          
        }

【讨论】:

  • 谢谢您的回答,先生。一定会试试这个。
猜你喜欢
  • 2021-07-29
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 2014-05-09
  • 2020-03-16
相关资源
最近更新 更多