您的位置:首页 > 产品设计 > UI/UE

UITableView中Cell的位置交换

2015-07-29 20:51 549 查看

cell的位置交换

先上代码:

/// Move Cell
override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {
LOG("star:\(sourceIndexPath.row) end:\(destinationIndexPath.row)")

let bk = bookmark[sourceIndexPath.row]
if sourceIndexPath.row > destinationIndexPath.row {
realm.write {
self.bookmark.insert(bk, atIndex: destinationIndexPath.row)
self.bookmark.removeAtIndex(sourceIndexPath.row + 1)
}
} else if sourceIndexPath.row < destinationIndexPath.row {
realm.write {
self.bookmark.insert(bk, atIndex: destinationIndexPath.row + 1)
self.bookmark.removeAtIndex(sourceIndexPath.row)
}
}
}
/// Can Move Cell
override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool {
return true
}

/// Can Edit Cell
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
return true
}

首先,实现上面3个代理方法

func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath)
func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool
func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool
然后,拿到当前选中的元素,或者叫数据都可以,这个元素是根据当前的indexPath.row在数组中拿到的。
拿到之后,开始对其进行判断比较。

如果当前选中的indexPath.row 大于 移动到的IndexPath.row 的话,则在数组中的destinationIndexPath.row的位置插入选中的元素,删除sourceIndexPath.row + 1 位置上的元素。

这里可能有点绕,举个例子:

数组:[a,b,c,d,e,f];

选中的数据保存到tmp中:tmp = c 也就是说,我们现在选中的是c并且开始选中的位置是2;

然后我们把它移动到:a的位置,也就是说移动到的indexpath.row是0;

这里的伪代码就是:开始位置 > 移动后位置 { 将tmp的数据插入移动后的位置0;删除开始选中位置 + 1 的数据 };

插入后数组样式:【c,a,b,c,d,e,f】我们在0的位置插入了蓝色的c,这个时候数组中就会有2个c,我们必须将红色的c删除;

删除的时候必须在之前2的基础上+1才可以正确的拿到要删除的元素 【c,a,b,c,d,e,f】,因为此时红色的c的游标是3;

同理

如果当前选中的indexPath.row 小于 移动到的IndexPath.row 的话,则在数组中的destinationIndexPath.row + 1 的位置插入选中的元素,删除sourceIndexPath.row 位置上的元素。

数组:[a,b,c,d,e,f];

选中的数据保存到tmp中:tmp = b 现在选中的是b并且开始选中的位置是1;

然后我们把它移动到:e的位置,也就是说移动到的indexpath.row是4;

这里的伪代码就是:开始位置 < 移动后位置 { 将tmp的数据插入移动后的位置4+1;删除1 位置的数据 };

插入后数组样式:【a,b,c,d,e,b,f】我们在4+1的位置插入了蓝色的b,这个时候数组中就会有2个b,我们必须将红色的b删除;

以上就是cell交换位置的说明,希望可以帮到正在看这篇文章的朋友
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: