为了重新排列UITableView行,我必须实现哪些方法?

时间:2009-01-28 02:37:45

标签: iphone objective-c cocoa-touch uitableview

对于使用名为rows的字符串的NSMutableArray的简单示例,我必须在表控制器中实现什么来移动tableView行并将更改反映在我的数组中?

5 个答案:

答案 0 :(得分:14)

在这里,我们做重物。

 - (void)tableView:(UITableView *)tableView 
moveRowAtIndexPath:(NSIndexPath *)fromIndexPath 
       toIndexPath:(NSIndexPath *)toIndexPath 
{
    NSLog(@"move from:%d to:%d", fromIndexPath.row, toIndexPath.row);
    // fetch the object at the row being moved
    NSString *r = [rows objectAtIndex:fromIndexPath.row]; 

    // remove the original from the data structure
    [rows removeObjectAtIndex:fromIndexPath.row];

    // insert the object at the target row
    [rows insertObject:r atIndex:toIndexPath.row];
    NSLog(@"result of move :\n%@", [self rows]);
}

由于这是一个基本的例子,让我们让所有的行都可以移动。

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

答案 1 :(得分:11)

上述任何一种都不会起作用。 在原始发布的代码中,tableview将崩溃,因为它会删除仍在使用的数据,即使在更正之后,由于表的方式“重新排列”,数组也没有正确的数据。

exchangeObjectAtIndex:withObjectAtIndex:根据tableview如何实现自己的重新排列,无法重新排列数组

为什么呢? 因为当用户选择一个表格单元格来重新排列它时,该单元格不会与它们移动到的单元格交换。他们选择的单元格将插入新行索引,然后删除原始单元格。至少这是用户看起来的方式。

解决方案: 由于tableview实现重新排列的方式,我们需要执行检查以确保添加和删除右行。 我把这个代码放在一起很简单,对我来说非常适合。

使用原始发布的代码数据作为示例:


 - (void)tableView:(UITableView *)tableView 
moveRowAtIndexPath:(NSIndexPath *)fromIndexPath 
       toIndexPath:(NSIndexPath *)toIndexPath 
{
    NSLog(@"move from:%d to:%d", fromIndexPath.row, toIndexPath.row);
    // fetch the object at the row being moved
    NSString *r = [rows objectAtIndex:fromIndexPath.row]; 

        // checks to make sure we add and remove the right rows
    if (fromIndexPath.row > toIndexPath.row) {

        // insert the object at the target row
        [rows insertObject:r atIndex:toIndexPath.row];

        // remove the original from the data structure
        [rows removeObjectAtIndex:(fromIndexPath.row + 1)];
    }
    else if (fromIndexPath.row < toIndexPath.row) {

        // insert the object at the target row
        [rows insertObject:r atIndex:(toIndexPath.row + 1)];

        // remove the original from the data structure
        [rows removeObjectAtIndex:(fromIndexPath.row)];

    }

}

如果您花一些时间看看重新排列期间桌面视图会发生什么,您就会明白我们为什么要添加1的位置。

我对xcode很新,所以我知道可能有一种更简单的方法可以做到这一点,或者代码可能会被简化....只是想尽力帮助我,因为它花了我几个小时弄清楚这一点。希望这能节省一些时间!

答案 2 :(得分:5)

根据Apple的文档和我自己的经验,这是一些非常有效的简单代码:

NSObject *tempObj = [[self.rows objectAtIndex:fromIndexPath.row] retain];
[self.rows removeObjectAtIndex:fromIndexPath.row];
[self.rows insertObject:tempObj atIndex:toIndexPath.row];
[tempObj release];

答案 3 :(得分:0)

NSMutableArray有一个名为exchangeObjectAtIndex:withObjectAtIndex:的方法。

答案 4 :(得分:0)

在对付一个简单的实现后,发现了这个讨论... Michael Berding解决方案对我来说是最好的,Apple方式,只记得在使用ARC时删除保留和释放。所以,一个更简洁的解决方案

NSObject *tempObj = [self.rows objectAtIndex:fromIndexPath.row];
[self.rows removeObjectAtIndex:fromIndexPath.row];
[self.rows insertObject:tempObj atIndex:toIndexPath.row];