没有在 UITableViewController 中调用 DidSelectRowAt

Posted

技术标签:

【中文标题】没有在 UITableViewController 中调用 DidSelectRowAt【英文标题】:DidSelectRowAt not being called in a UITableViewController 【发布时间】:2018-12-14 14:56:34 【问题描述】:

我知道对此的典型解决方案是将tableViewdelegate 分配给UIViewController。这里的问题是这实际上是一个UITableViewController。话虽如此,这就是问题所在。

我有CategoriesTVC,它继承自SwipeTVCSwipeTVC 的超类是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 没有响应键盘

没有在 UITableViewController 中调用 DidSelectRowAt

为啥 UIViewController 在 UINavigationBar 下扩展,而 UITableViewController 没有?

UITableViewController 在初始化时没有选择单元格

UITableViewController - 在 refreshControl.endRefreshing() 之后表格没有返回到它的初始位置

如何在没有 UITableViewController 的情况下结束 UIRefreshControl