在 moveRowAtIndexPath 之后重新加载数据

Posted

技术标签:

【中文标题】在 moveRowAtIndexPath 之后重新加载数据【英文标题】:reloadData after moveRowAtIndexPath 【发布时间】:2016-01-13 11:21:24 【问题描述】:

我有一个tableview 有两个部分:要购买的成分和用户已经拥有的成分。因此,基本上,当使用购物时,他/她会将一种成分从一个列表传递到另一个列表。

这里是tableView:cellForRowAtIndexPath

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
   let cell = tableView.dequeueReusableCellWithIdentifier("IngredientCell", forIndexPath: indexPath) as! IngredientCell
   cell.checkbox.checkboxDelegate = self
   cell.checkbox.checkboxIndex = indexPath
   ...

我称之为: (我包括了 stateOfCheckbox - 每个 tableviewcell 都包含一个自定义按钮,其角色为checkbox - 基本上这个按钮给了我从/到的方向,我将进行移动)。

 func doChange(stateOfCheckbox: Bool, row: Int)
   let fromSection = stateOfCheckbox ? 0 : 1
   let toSection = stateOfCheckbox ? 1 : 0

   let fromIndexPath = NSIndexPath(forRow: row, inSection: fromSection)
   let toIndexPath = NSIndexPath(forRow: 0, inSection: toSection)

   let dataPiece = ingredients[fromIndexPath.section][fromIndexPath.row]
   ingredients[toIndexPath.section].insert(dataPiece, atIndex: toIndexPath.row)
   ingredients[fromIndexPath.section].removeAtIndex(fromIndexPath.row)

   ingredientsTableView.moveRowAtIndexPath(fromIndexPath, toIndexPath: toIndexPath)
   ingredientsTableView.reloadData()

我不想调用reloadData,但是当不调用时,表索引会混淆。有必要吗?还是有别的办法?

如果reloadData 不存在,这就是行为方式。我不想重新加载所有内容并重新绘制。最佳做法是什么?

【问题讨论】:

“索引混淆了”到底是什么意思?发生了什么,你收到错误了吗? 首先当一个复选框被选中时,该行将被发送到第二部分。第二次,如果我选择第三行,它可以将第四种成分发送到“Got'em”部分。第三个复选框保持选中状态。 (我没有在第一部分检查项目)。只是好像画得不对。 您的row 似乎差了一位。您能否发布一些调用doChange() 的代码? 我可以发帖。但是当reloadData 被调用时一切正常,并不总是第二个消失,有时它可能会消失第三个。 if let delegate = checkboxDelegate, let index = checkboxIndex delegate.doChange(isChecked, row: index) checkboxIndex 在 tableView:cellForRowAtIndexPath 和 indexPath.row 中设置 【参考方案1】:

我很确定问题不在于您在问题中发布的代码。从我在 Gif 中看到的情况来看,必须是以下情况:

如果您选中一个,然后在其下方选中一个,则索引将移动 1。实际情况:它仍然使用检查第一个索引之前的旧索引。这些索引要么需要刷新,要么 - 我更喜欢 - 在您实际点击它时确定。

【讨论】:

哦,我想我明白了。我正在这样做(在tableView:cellForRowAtIndexPathcell.checkbox.checkboxIndex = indexPath ,我稍后会在doChange 方法中使用它。不调用 reloadData 时,不会计算新索引。我会试试看。谢谢指教!【参考方案2】:

您可以使用 UITableView 的方法:tableview.beginUpdates()tableview.endUpdates()

func doChange(stateOfCheckbox: Bool, row: Int)
   let fromSection = stateOfCheckbox ? 0 : 1
   let toSection = stateOfCheckbox ? 1 : 0

   let fromIndexPath = NSIndexPath(forRow: row, inSection: fromSection)
   let toIndexPath = NSIndexPath(forRow: 0, inSection: toSection)

   let dataPiece = ingredients[fromIndexPath.section][fromIndexPath.row]
   ingredients[toIndexPath.section].insert(dataPiece, atIndex: toIndexPath.row)
   ingredients[fromIndexPath.section].removeAtIndex(fromIndexPath.row)

   tableview.beginUpdates()
   ingredientsTableView.moveRowAtIndexPath(fromIndexPath, toIndexPath: toIndexPath)
   tableview.endUpdates()


【讨论】:

我已经尝试了您的解决方案,但没有成功。该行为仍然存在。我做了一个 gif 来说明这一点。当我reloadData 时,一切正常,虽然我可以看到一个 flickr。

以上是关于在 moveRowAtIndexPath 之后重新加载数据的主要内容,如果未能解决你的问题,请参考以下文章

moveRowAtIndexPath - 在部分之间移动单元格

moveRowAtIndexPath:如何在最后一行移动到另一个部分后删除部分

moveRowAtIndexPath 没有删除按钮

UITableView: 使用 moveRowAtIndexPath:toIndexPath: 和 reloadRowsAtIndexPaths:withRowAnimation: 一起出现损坏

编辑表格视图时是不是可以删除舍入删除指示符?

熊猫:在groupby之后重新塑造/重新转动数据框