Swift indexPathsForSelectedRows返回nil

Loh*_*olu 5 uitableview ios swift

我正在使用tableView,目标是实现可扩展/可折叠的tableView单元格。单元格的数量是完全动态的。

我的工作正常,但是有一个小问题。我正在使用didSelectRowAtIndexPath来切换展开/折叠单元格。因此,现在发生的事情是通过在单元格的任意位置点击来执行切换。:-(

在单元内部,我有两个UIView(分别是Header和Detail)。我需要切换展开/折叠才能仅在点击“页眉”而不是整个单元格时起作用。

为此,我像在这里那样获取indexPath,但是由于indexPathsForSelectedRows返回nil,因此无法正常工作。

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }


    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return myVouchers.count
    }

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        if selectedIndex == indexPath.row {
            return 150.0
        }
        else {
            return 40.0
        }
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        cell = tableView.dequeueReusableCellWithIdentifier("CollapsedCell", forIndexPath: indexPath) as! CollapsedCell

        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action:#selector(VoucherDetailViewController.expandCell(_:)))
        (cell as! CollapsedCell).headerView.addGestureRecognizer(tapGestureRecognizer)

        return cell
    }

    func getIndexPathForSelectedCell() -> NSIndexPath? {

        var indexPath: NSIndexPath?

        if tableView.indexPathsForSelectedRows?.count > 0 {   //**nil is returned here**
            indexPath = (tableView.indexPathsForSelectedRows?[0])! as NSIndexPath
        }
        return indexPath
    }

    func expandCell(sender: UITapGestureRecognizer) {
        if let myIndexPath = getIndexPathForSelectedCell() {
            if selectedIndex == myIndexPath.row {
                selectedIndex = -1
            }
            else {
                selectedIndex = myIndexPath.row
            }

            self.tableView.beginUpdates()
            self.tableView.reloadRowsAtIndexPaths([myIndexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
            self.tableView.endUpdates()
        }
    }
Run Code Online (Sandbox Code Playgroud)

有人可以给我一个提示为什么indexPathsForSelectedRows返回nil吗?

非常感谢!

更新1: 当前工作演示

当我在didSelectRowAtIndexPath中添加扩展单元格逻辑并删除单元格内视图的tapGestureRecognizer时,它看起来像这样-

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

        if selectedIndex == indexPath.row {
            selectedIndex = -1
        }
        else {
            selectedIndex = indexPath.row
        }

        self.tableView.beginUpdates()
        self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
        self.tableView.endUpdates()
    }
Run Code Online (Sandbox Code Playgroud)

Vla*_*bir 3

你遇到这个错误是因为

self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
Run Code Online (Sandbox Code Playgroud)

重新加载并取消选择您的行。

您只需选择行,然后重新加载行(此操作将取消选择该行),稍后您想使用以下方式获取选定的行

tableView.indexPathsForSelectedRows
Run Code Online (Sandbox Code Playgroud)

但表视图此时没有任何选定的行。

作为解决方案,您可以将选定的 indexPath 存储在新变量中,并使用此变量而不是

tableView.indexPathsForSelectedRows
Run Code Online (Sandbox Code Playgroud)