在我的应用程序中,我有一个UIKit ContactsTableViewController,它呈现联系人列表,当联系人被按下时,导航控制器呈现DetailViewController。现在我想在SwiftUI中重用那个ContactsTableViewController所以我已经创建了一个uiviewcontrollerrepresable并且我已经在这里移动了tableVIew(tableVIew: didSelectRowAt:)方法但是现在我不能把DetailsViewController推到NavigationController因为我没有它的引用。那么如何做到这一点呢?
struct ContactView: UIViewControllerRepresentable {
let viewModel: ContactsViewModel
func makeUIViewController(context: Context) -> ContactsTableViewController {
let vc = ContactsTableViewController(viewModel: viewModel)
vc.tableView.delegate = context.coordinator
return vc
}
func updateUIViewController(_ uiViewController: ContactsTableViewController, context: Context) {
}
}
extension ContactView {
class Coordinator: NSObject, UITableViewDelegate {
var parent: ContactView
init(_ parent: ContactView) {
self.parent = parent
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// Get the selected contact
let contact = parent.viewModel.contacts[indexPath.row]
// Create a view model for the detail view
let dependencies: DetailsViewModel.Dependencies = .init(contacts: parent.viewModel.contacts, contactMethod: contact.contactMethod)
let viewModel = DetailsViewModel(dependencies: dependencies)
// Present the detail view controller
let detailsViewController = viewModel.detailViewControllerFactory(viewModel.contacts, selectedContact.contactMethod)
//navigationController?.pushViewController(detailsViewController, animated: true)
}
}
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
}
struct Contacts_Previews: PreviewProvider {
static let dependencies = Dependencies()
static var previews: some View {
ContactView(viewModel: dependencies.contactsViewModel)
}
}
协调器没有设置正确,下面是正确的方法:
func makeCoordinator() -> Coordinator {
Coordinator()
}
func makeUIViewController(context: Context) -> ContactsTableViewController {
context.coordinator.contactsTableViewController
}
还必须实现updateUIViewController
,并在let
s和@Binding vars
中使用结构体的新值来更新Coordinator
和/或UIViewController
。在您的例子中,您将设置选定的联系人,并为在新绑定上设置控制器选定的联系人设置闭包。
现在在协调器中你可以做:
class Coordinator: NSObject, ContactsTableViewControllerDelegate {
lazy var contactsTableViewController: ContactsTableViewController = {
let vc = ContactsTableViewController()
vc.delegate = self
return vc
}()
func contactsTableViewController(_ contactsTableViewController: ContactsTableViewController, didSelectContact: Contact) {
...
contactsTableViewController.showViewController(detailsViewController, animated: true)
}
最后,最好删除任何UIKit视图模型,在SwiftUI中view结构体已经是一个。