moveRowAtIndexPath

时间:2016-01-13 11:21:24

标签: swift checkbox tableview reloaddata

我有一个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不存在,这就是表现的方式。我不想重新加载所有内容并再次重新绘制。什么是最佳做法?

behaviour

2 个答案:

答案 0 :(得分:1)

我很确定问题不在您在问题中发布的代码中。根据我在Gif中看到的情况,必须遵循以下规则:

如果您选中一个,然后检查下面的一个,则索引会移动一个。实际上发生了什么:在第一个检查之前,它仍然使用旧索引。这些指数要么需要刷新,要么 - 我更喜欢 - 在您实际点击它时确定。

答案 1 :(得分:0)

您可以使用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()

}