没有在 UITableViewController 中调用 DidSelectRowAt
Posted
技术标签:
【中文标题】没有在 UITableViewController 中调用 DidSelectRowAt【英文标题】:DidSelectRowAt not being called in a UITableViewController 【发布时间】:2018-12-14 14:56:34 【问题描述】:我知道对此的典型解决方案是将tableView
的delegate
分配给UIViewController
。这里的问题是这实际上是一个UITableViewController
。话虽如此,这就是问题所在。
我有CategoriesTVC
,它继承自SwipeTVC
(SwipeTVC
的超类是UITableViewController
)。一切正常,突然停止了。不知道为什么。
我在didSelectRowAt
方法上设置了一个断点,但它从未被执行。代码如下:
class CategoryTVC: SwipeTVC
let realm = try! Realm()
var categories: Results<Category>?
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if segue.identifier == "goToItems"
let destination = segue.destination as! ToDoListTVC
if let indexPath = tableView.indexPathForSelectedRow
destination.selectedCategory = categories?[indexPath.row]
// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return categories?.count ?? 1
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = super.tableView(tableView, cellForRowAt: indexPath)
cell.textLabel?.text = categories?[indexPath.row].name ?? "No categories added yet"
cell.backgroundColor = UIColor(hexString: categories?[indexPath.row].backgroundColor ?? "DA7553")
return cell
// MARK: Table View Delegate methods
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
super.tableView(tableView, didSelectRowAt: indexPath)
performSegue(withIdentifier: "goToItems", sender: self)
class SwipeTVC: UITableViewController, SwipeTableViewCellDelegate
var cell: UITableViewCell?
// MARK:- Table View DataSource
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! SwipeTableViewCell
cell.delegate = self
return cell
func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> [SwipeAction]?
guard orientation == .right else return nil
let deleteAction = SwipeAction(style: .destructive, title: "Delete") action, indexPath in
self.updateModel(at: indexPath)
deleteAction.image = UIImage(named: "delete")
return [deleteAction]
func tableView(_ tableView: UITableView, editActionsOptionsForRowAt indexPath: IndexPath, for orientation: SwipeActionsOrientation) -> SwipeOptions
var options = SwipeOptions()
options.expansionStyle = .destructive
return options
// MARK:- Swipe Actions
func updateModel(at indexPath: IndexPath)
// overridden in VC
【问题讨论】:
【参考方案1】:更高效的解决方案:
将segue从表视图cell连接到目标控制器而不是视图controller,删除didSelectRowAt
并将prepare(for
替换为
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
if segue.identifier == "goToItems"
let destination = segue.destination as! ToDoListTVC
let cell = sender as! SwipeTableViewCell
if let indexPath = tableView.indexPath(for: cell)
destination.selectedCategory = categories?[indexPath.row]
【讨论】:
我对此进行了测试。可悲的是,它没有任何改变。我在它上面放了一个断点,它也从来没有被调用过。 如果if
条件失败,请确保所有中间子类在覆盖方法中调用super
,例如在prepare(for
中。
感谢您的宝贵时间。我想到了。这是我的错。【参考方案2】:
我发现了问题。我不小心将tableView
selection
更改为no selection
。我的错。不是代码。
【讨论】:
以上是关于没有在 UITableViewController 中调用 DidSelectRowAt的主要内容,如果未能解决你的问题,请参考以下文章
没有在 UITableViewController 中调用 DidSelectRowAt
为啥 UIViewController 在 UINavigationBar 下扩展,而 UITableViewController 没有?
UITableViewController 在初始化时没有选择单元格
UITableViewController - 在 refreshControl.endRefreshing() 之后表格没有返回到它的初始位置