我现在正在开发一个UI组件,因为它的行为类似于UITableView,我在UITableView之后对代理和数据源协议进行了大量建模。但是,我注意到一种我不太明白的方法 - 'canMoveRowAtIndexPath'。
这实质上允许委托者指定它是否希望给定的单元格是“可移动的”。但是,不会将另一个可移动单元放入比不可移动单元更高的索引(即表中“它上面”)导致它无论如何间接移动? (因为移动的下面的每个单元格都会向下推一行)。
所以基本上,我的问题是这个方法有什么意义?任何人都可以提供一个示例用例吗?因为我在讨论是否应该在我的组件中包含它而烦恼。
如果有的话,我想也许更有用的委托方法可能是'canMoveRowInSection',它允许你指定是否可以移动给定部分中的任何行。然后,这将允许您禁用特定部分的重新排序,并将该部分之外的其他行移动不会影响其中行的排序。
我知道Apple工程师出于某种原因提供了这种方法,我只是看不出那个原因。
感谢您的任何见解!
答案 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;
}