我阅读了有关如何在UITableView中管理行的删除和重新排序的文档。我创建了编辑按钮,我可以删除行。我希望用户能够重新排序行。这看起来很简单,但我无法理解如何告诉细胞他们可以被移动。
要告诉他们可以删除的行我使用editingStyleForRowAtIndexPath,但是如何告诉单元格它也可以被移动以及我在哪里设置showsReorderControl?我试图放在cellForRowAtIndexPath中,但没有显示任何内容。
谢谢!
答案 0 :(得分:36)
你必须说可以移动行:
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
并实现此委托以更新您的数据源:
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
请参阅Managing the Reordering of Rows
的Table View Programming Guide for iOS答案 1 :(得分:4)
在我的情况下,我已经实现了Apple文档和答案中提到的所有必需的UITableViewDelegate方法,但仍然看不到重新排序控件。最终我发现它是因为我在没有调用super的默认实现的情况下覆盖了layoutSubviews方法。添加[super layoutSubviews]后,我的重新排序控件终于出现了。
我们需要调用[super layoutSubviews]的原因是因为当我们切换表的编辑属性时,它将调用单元格的layoutSubviews方法,并且系统提供的控件(如重新排序控件)将显示在UITableViewCell的默认layoutSubviews方法中。一旦你意识到这一点,你也可以修改你的layoutSubviews实现来改变你的单元格的外观,这取决于它是否被编辑,以便在重新排序控件出现时不那么笨拙。
所以这是行重新排序的清单:
答案 2 :(得分:2)
添加到@benoit上面的答案。如果你的模型恰好是一个可变数组,那么这样就足够了tableView:moveRowAtIndexPath:toIndexPath:
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
id objectToMove = [_objects objectAtIndex:fromIndexPath.row];
[_objects removeObjectAtIndex:fromIndexPath.row];
[_objects insertObject:objectToMove atIndex:toIndexPath.row];
[tableView reloadData];
[self saveObjects]; // A method of your own to make new positions persistent
}
答案 3 :(得分:2)
试试这个。 。 。这将在简单的tableview情况下处理单元格的安排和更新
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
[tableData insertObject: [tableData objectAtIndex:sourceIndexPath.row] atIndex:destinationIndexPath.row];
[tableData removeObjectAtIndex:(sourceIndexPath.row + 1)];
}