Передача информации между двумя экземплярами UITableViewController через делегирование, очевидно, не так сложна, как поначалу казалось.Единственная заслуживающая внимания часть - это настройка делегата.Внутри пользовательского класса TableViewController, когда один экземпляр инициализируется, он должен установить себя в качестве делегата другого экземпляра.Вот и все!
В этом случае, чтобы ссылаться на один экземпляр из другого, можно использовать родительский элемент tableViewController, чтобы перейти к другому дочернему элементу tableViewController.Хотя может быть лучший способ сделать это, посмотрите код моего конкретного решения.Примечательно, что так как родительское свойство еще не установлено сразу после viewDidLoad (), мне нужно было настроить все в viewWillAppear ().Также обратите внимание, что этот подход не требует использования restoreIdentifiers или тегов.Скорее, он косвенно определяет экземпляр tableViewController через свое свойство tableView.
Делегированная функция didSelectInTableView () передает selectedInTableView, который был выбран в другом экземпляре tableViewController.Поскольку делегату необходимо очистить свои собственные выбранные строки, selectedInTableView не нужен для этой цели.То есть для простой очистки строк функции не нужно ничего передавать.
protocol TableViewSelectionDelegate: AnyObject {
func didSelectInTableView(_ selectedInTableView: UITableView)
}
class TableViewController: UITableViewController, TableViewSelectionDelegate {
weak var delegate: TableViewSelectionDelegate?
// Received by segue
var displayables: [Character] = []
override func viewDidLoad() {
super.viewDidLoad()
}
// (It's too soon to determine parents/children in viewDidLoad())
override func viewWillAppear(_ animated: Bool) {
guard let siblingTableViewControllers = parent?.children as? [TableViewController] else { return }
switch tableView {
case siblingTableViewControllers[0].tableView: siblingTableViewControllers[1].delegate = self
case siblingTableViewControllers[1].tableView: siblingTableViewControllers[0].delegate = self
default: print("Unidentified Table View Controller")
}
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
delegate?.didSelectInTableView(tableView)
}
func didSelectInTableView(_ selectedInTableView: UITableView) {
// selectedTableView is NOT the one that needs to be cleared
// The function only makes it available for other purposes
tableView.indexPathsForSelectedRows?.forEach { indexPath in
tableView.deselectRow(at: indexPath, animated: false)
}
}
}
Пожалуйста, не стесняйтесь исправлять мою концептуализацию и терминологию.