该应用程序仍然大量使用ViewControllers和TableViewControllers,这使得SwiftUI很难集成。
首先,我从一个swiftUI视图展示了一个ViewController视图。
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())
}
...
}我想完全离开快速ui屏幕,继续使用视图控制器,直到我按下后退按钮并返回到SwiftUI屏幕。而且,即使我创建了第二个专用于TableViewControllers的注入器类,注入器似乎也不适用于TableView。
这种导航方式可能吗?如果有什么不清楚的地方,不要犹豫留下评论。谢谢
发布于 2021-01-17 19:07:52
问题是.sheet是一个模态视图,您希望它成为全屏视图吗?在这种情况下,尝试用.fullScreenCover替换.sheet
若要在TableViewController中显示SwiftUI,请尝试将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) {
}https://stackoverflow.com/questions/65673300
复制相似问题