【发布时间】:2019-11-05 14:36:46
【问题描述】:
在界面生成器中,我在 UIStackView 的容器视图中嵌入了 UITableViewController 的两个实例。两个 TableViewController 都链接到同一个自定义类文档(参见下面的代码)。它们之间的唯一区别在于它们显示的数据。两者都有允许多选的 UITableViews - 但我也希望选择一个表中的任何内容会导致取消选择另一个表中的所有内容,反之亦然。我尝试使用委托进行设置,但我不知道如何在 UITableViewController 中从另一个实例引用一个实例,以将每个实例分配为另一个实例的委托。
除了子类名称之外,我找不到任何关于委托或关于通过任何其他方式引用视图控制器的相关信息。所以在我最近的尝试中,我尝试引用父对象的另一个子对象。以下是相关代码:
protocol TableViewSelectionDelegate: AnyObject {
func didSelectInTableView(_ tableView: UITableView)
}
class TableViewController: UITableViewController, TableViewSelectionDelegate {
weak var delegate: TableViewSelectionDelegate?
@IBOutlet var numbersTableView: UITableView!
@IBOutlet var lettersTableView: UITableView!
// 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 tableViewControllers = parent?.children else {
print("No tableViewControllers found!")
return
}
switch restorationIdentifier {
case "NumbersTableViewController":
for tableViewController in tableViewControllers {
if tableViewController.restorationIdentifier == "LettersTableViewController" {
delegate = tableViewController as? TableViewSelectionDelegate
}
}
case "LettersTableViewController":
for tableViewController in tableViewControllers {
if tableViewController.restorationIdentifier == "NumbersTableViewController" {
delegate = tableViewController as? TableViewSelectionDelegate
}
}
default: print("Unidentified Table View Controller")
}
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
delegate?.didSelectInTableView(tableView)
}
func didSelectInTableView(_ tableView: UITableView) {
switch tableView {
case numbersTableView:
numbersTableView.indexPathsForSelectedRows?.forEach { indexPath in
numbersTableView.deselectRow(at: indexPath, animated: false)
}
case lettersTableView:
lettersTableView.indexPathsForSelectedRows?.forEach { indexPath in
lettersTableView.deselectRow(at: indexPath, animated: false)
}
default: print("Unidentified Table View")
}
}
}
运行上述程序并在任一表中点击会导致控制台打印“未识别的表视图”,并且通过在另一个表中进行选择来清除两个表的选择。
任何关于如何获得我想要的结果的见解将不胜感激。如果这里有什么不清楚的地方,请告诉我,我会更新。
【问题讨论】:
标签: ios swift uitableview delegation