一个TableViewController的uiviewcontrollerrepresable如何处理导航?<



在我的应用程序中,我有一个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,并在lets和@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结构体已经是一个。

相关内容

最新更新