该应用程序仍在大量使用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一起工作。
这种类型的导航可能吗?如果有什么不清楚的地方,请毫不犹豫地留下评论。感谢
问题是.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) {
}