1

我现在正在开发一个 UI 组件,因为它的行为类似于 UITableView,所以我在 UITableView 之后对委托和数据源协议进行了大量建模。但是,我注意到一种我不太了解的方法——“canMoveRowAtIndexPath”。

这实质上允许代理指定它是否希望给定的单元格是“可移动的”。但是,将另一个可移动单元格放入比不可移动单元格更高的索引(即在表格中的“上方”)不会导致它间接移动吗?(因为被移动的单元格下方的每个单元格都会被向下推一排)。

所以基本上,我的问题是这种方法的意义何在?任何人都可以提供一个示例用例吗?因为我正在争论我是否应该费心将它包含在我的组件中。

如果有的话,我认为更有用的委托方法可能是诸如“canMoveRowInSection”之类的东西,它允许您指定是否可以移动给定部分中的任何行。这将允许您禁用特定部分的重新排序,并且将其他行移到该部分之外不会影响其中行的顺序。

我知道 Apple 工程师提供这种方法是有原因的,我只是看不出这个原因可能是什么。

感谢您的任何见解!

4

1 回答 1

4

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

由开发人员负责处理该动作的另一面。

例如,假设您有一个包含“A”、“B”、“C”的数组NSMutableArray准确地说),并且您想将该数组重新排列为“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;
}
于 2012-06-04T19:39:46.473 回答