indexPathsForSelectedRows返回nil

indexPathsForSelectedRows返回nil

我正在使用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()
        }
    }

有人可以给我一个线索,为什么indexPathsForSelectedRows返回nil吗?

非常感谢!

更新1:
Current Working demo

当我在didSelectRowAtIndexPath中添加扩展单元格逻辑并删除单元格内 View 的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()
    }

最佳答案

您收到此错误是因为

self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)

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

您只需选择行,然后重新加载行(此操作将取消选择该行),然后您想使用
tableView.indexPathsForSelectedRows

但是表格 View 目前没有任何选定的行。

作为解决方案,您可以将选定的indexPath存储在新变量中,并使用此变量代替
tableView.indexPathsForSelectedRows

关于ios - Swift indexPathsForSelectedRows返回nil,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44410616/

10-11 14:55