为啥没有调用 didDeselectRowAtIndexPath

Posted

技术标签:

【中文标题】为啥没有调用 didDeselectRowAtIndexPath【英文标题】:why is didDeselectRowAtIndexPath not called为什么没有调用 didDeselectRowAtIndexPath 【发布时间】:2015-11-09 09:03:32 【问题描述】:

didSelectRowAtIndexPath 被调用,但 didDeselectRowAtIndexPath 未被调用。我不知道为什么。我在网上搜索。很多类似的问题,但我没有找到答案。

这是我的桌面视图

//tableView
    let tempTableView = UITableView()
    tempTableView.delegate = self
    tempTableView.dataSource = self
    tempTableView.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(tempTableView)
    self.tableView = tempTableView

这是委托人

 //MARK: UITableViewDelegate
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

   self.cayegoryArray[indexPath.row].isSelected = true
   self.tableView?.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)



func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) 

    self.cayegoryArray[indexPath.row].isSelected = false
    self.tableView?.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)

这是单元格。

override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    self.selectionStyle = .Default

    setInterface()
    setLayout()


required init?(coder aDecoder: NSCoder) 
    fatalError("init(coder:) has not been implemented")

【问题讨论】:

"tableView(_:didDeselectRowAtIndexPath:) 只会在另一个单元格被选中后被调用。" 您确定没有调用“didDeselect...”吗?还是它被调用并且 tableView 没有重新加载?两件事:将 pint() 添加到“didDeselect...”中以确保它没有被调用,另一件事:确保单元格被选中。 @FattiKhan 当我第二次点击不同的单元格时,它会被调用。 @rose:这是所需的行为,当取消选择单元格时,将调用 didDeselect 方法。当您第一次点击一个单元格时,之前没有选择任何单元格(因此不会调用 didDeselect)。当您点击另一个单元格时,那个时候会有一个先前选择的单元格,并且该方法将被调用。 @rose 哦,你是对的,对不起。您正在重新加载您的行,因此,不应再选择该行...看看:(保持选中状态)***.com/a/13046014/4906484 【参考方案1】:

问题是由于self.tableView?.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None) 导致单元格重新加载,因此它永远不会被取消选择。

您可以在重新加载单元格后添加self.tableView?.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: .None) 来解决这些问题

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 

   self.cayegoryArray[indexPath.row].isSelected = true
   self.tableView?.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)
   self.tableView?.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: .None)

【讨论】:

以上是关于为啥没有调用 didDeselectRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

为啥没有调用 paymentQueue(_:shouldAddStorePayment:_:) ?

为啥dismissWithClickedButtonIndex 从来没有调用clickedButtonAtIndex?

为啥 textFieldDidEndEditing: 没有被调用?

为啥我的 SecurityWebFilterChain 没有被调用?

为啥我的 UISearchController 委托方法没有被调用?

为啥没有“通用事件”的调用堆栈