Какие методы мне нужно реализовать, чтобы переупорядочить строки UITableView? - PullRequest
6 голосов
/ 28 января 2009

Для простого примера использования NSMutableArray строк, называемых строками, что я должен реализовать в контроллере таблицы, чтобы переместить строки tableView и отразить изменения в моем массиве?

Ответы [ 5 ]

14 голосов
/ 28 января 2009

Здесь мы делаем нашу тяжелую работу.

 - (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;
}
11 голосов
/ 19 июля 2009

Ничего из перечисленного не будет работать. В исходном опубликованном коде табличное представление будет аварийно завершено, поскольку оно удаляет данные, которые все еще будут использоваться, и даже после того, как это будет исправлено, массив не будет иметь правильных данных из-за способа, которым таблица «переставляет». *

exchangeObjectAtIndex: withObjectAtIndex: не будет работать для перестановки массива в соответствии с тем, как табличное представление реализует свою собственную перестановку

Почему? Потому что, когда пользователь выбирает ячейку таблицы, чтобы переставить ее, эта ячейка НЕ ​​заменяется на ячейку, в которую он перемещается. Выбранная ими ячейка вставляется с новым индексом строки, а затем исходная ячейка удаляется. По крайней мере, так кажется пользователю.

Решение: Из-за того, что 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 &gt 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 &lt 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)];

    }

}

Если вы потратите несколько минут и посмотрите, что происходит с просмотром таблицы во время перегруппировки, вы поймете, почему мы добавили единицы к тому, что мы сделали.

Я довольно новичок в xcode, так что я знаю, что, возможно, есть более простой способ сделать это, или код может быть упрощен .... Просто пытаюсь помочь, где могу, потому что это заняло у меня несколько часов чтобы понять это. Надеюсь, это сэкономит кому-то время!

5 голосов
/ 28 октября 2009

Согласно документации Apple и моему опыту, этот простой код работает довольно хорошо:

NSObject *tempObj = [[self.rows objectAtIndex:fromIndexPath.row] retain];
[self.rows removeObjectAtIndex:fromIndexPath.row];
[self.rows insertObject:tempObj atIndex:toIndexPath.row];
[tempObj release];
0 голосов
/ 12 апреля 2013

Я нашел эту дискуссию после того, как сломал мне голову против простой реализации ... Решение Майкла Бердинга - лучший способ для меня, Apple, просто не забудьте удалить retain и release при использовании ARC. Итак, более краткое решение

NSObject *tempObj = [self.rows objectAtIndex:fromIndexPath.row];
[self.rows removeObjectAtIndex:fromIndexPath.row];
[self.rows insertObject:tempObj atIndex:toIndexPath.row];
0 голосов
/ 28 января 2009

NSMutableArray имеет метод с именем exchangeObjectAtIndex:withObjectAtIndex:.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...