委托方法'canMoveRowAtIndexPath'的目的是什么?

时间:2012-06-04 19:32:04

标签: objective-c ios uitableview delegates

我现在正在开发一个UI组件,因为它的行为类似于UITableView,我在UITableView之后对代理和数据源协议进行了大量建模。但是,我注意到一种我不太明白的方法 - 'canMoveRowAtIndexPath'。

这实质上允许委托者指定它是否希望给定的单元格是“可移动的”。但是,不会将另一个可移动单元放入比不可移动单元更高的索引(即表中“它上面”)导致它无论如何间接移动? (因为移动的下面的每个单元格都会向下推一行)。

所以基本上,我的问题是这个方法有什么意义?任何人都可以提供一个示例用例吗?因为我在讨论是否应该在我的组件中包含它而烦恼。

如果有的话,我想也许更有用的委托方法可能是'canMoveRowInSection',它允许你指定是否可以移动给定部分中的任何行。然后,这将允许您禁用特定部分的重新排序,并将该部分之外的其他行移动不会影响其中行的排序。

我知道Apple工程师出于某种原因提供了这种方法,我只是看不出那个原因。

感谢您的任何见解!

1 个答案:

答案 0 :(得分:4)

canMoveRowAtIndexPath 告诉UITableView如果表格处于编辑模式,则可以上下移动单元格(或单元格,如果您具体选择)。

由开发人员负责处理该移动的另一方。

例如,假设您有一个数组(确切地说是NSMutableArray“A”,“B”,“C”,并且您想重新排列该数组为“ B“,”C“,”A“。您需要根据要移动的单元格的位置在数组中进行更改并保存该数组。

实施例

-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    return YES;
}

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
    id objectToMove = [[array objectAtIndex:fromIndexPath.row] retain];
    [array removeObjectAtIndex:fromIndexPath.row];
    [array insertObject:objectToMove atIndex:toIndexPath.row];
    [objectToMove release];
}

部分示例

这个例子说如果表格部分是0,那么没有单元格可以移动。任何其他部分(比如说你有3个),第1部分和第2部分中的那些单元格都会移动。您仍然需要相应地处理数组。

-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if ( indexPath.section == 0 )
        return NO;

    return YES;
}