2

我正在使用 xCode 7 beta 和 Swift 来实现带有 MGSwipeTableCells 的 tableview。我这样做是因为我需要在每个单元格的左侧和右侧都有一个滑动按钮。这两个按钮都需要从表格视图中删除单元格。

在将按钮添加到单元格时,我尝试使用便捷回调方法来执行此操作:

// Layout table view cell
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCellWithIdentifier("newsFeedCell", forIndexPath: indexPath) as! NewsFeedCell
    cell.layoutIfNeeded()

    // Add a remove button to the cell
    let removeButton = MGSwipeButton(title: "Remove", backgroundColor: color.removeButtonColor, callback: {
        (sender: MGSwipeTableCell!) -> Bool in

        // FIXME: UPDATE model
        self.numberOfEvents--
        self.tableView.deleteSections(NSIndexSet(index: indexPath.section), withRowAnimation: UITableViewRowAnimation.Fade)
        return true
    })
    cell.leftButtons = [removeButton]

但是,一旦我删除了第一个单元格,所有索引都会被丢弃,回调现在会删除一个不正确的单元格。也就是说,如果我删除 cell_0,cell_1 现在将成为表中的第 0 个。但是,与 cell_1 关联的按钮的回调会删除索引为 1 的单元格,即使它现在实际上是表中的第 0 个单元格。

我尝试实现 MGSwipeTableCell 委托方法,但无济于事。在我的代码执行过程中,这些方法都没有被调用过。我应该如何解决这个问题?实施委托会解决这个问题吗?如果,那么可以提供一个例子吗?如果没有,您能否建议一种替代方法,让表格视图单元格两侧都有滑动按钮,可以删除所述单元格?

4

2 回答 2

1

您还可以执行以下操作来获取正确的 indexPath:

let removeButton = MGSwipeButton(title: "Remove", backgroundColor: color.removeButtonColor, callback: {
            (sender: MGSwipeTableCell!) -> Bool in

  let indexPath = self.tableView.indexPathForCell(sender)         
  self.tableView.deleteSections(NSIndexSet(index: indexPath.section), withRowAnimation: UITableViewRowAnimation.Fade)
            return true
        })
于 2016-04-06T04:33:37.717 回答
0

使用委托方法将允许创建更清晰的按钮创建和删除表格单元格,因为只有在滑动单元格时才会为单元格创建按钮(节省内存),并且您可以捕获对“发送者”的弱引用(MGTableViewCell,或自定义类型)在处理程序中,然后您可以从中获取索引路径。按照他们在 Github 上的示例:MGSwipeTableCell/demo/MailAppDemo/MailAppDemo/MailViewController.m

然后在您的 cellForRowAtIndexPath 中,确保将单元格的委托设置为“self”。看起来你错过了这个,它应该解决你的委托方法问题。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let reuseIdentifier = "cell"
    let cell = self.table.dequeueReusableCellWithIdentifier(reuseIdentifier) as! MGSwipeTableCell!
    cell.delegate = self

    // Configure the cell

    return cell
}

快乐编码!

于 2016-06-20T17:15:16.577 回答