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