iPhone SDK: вставка и обновление UITableView с новой строкой - PullRequest
2 голосов
/ 26 марта 2009

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

[self.tableView reloadData];

В следующий раз, когда я вставлю дополнительную информацию в другое представление и попытаюсь перезагрузить таблицу, все видимые в данный момент строки будут дублированы.

Другими словами, когда я запускаю приложение, у меня есть:

tableView:
    Row 1
    Row 2

Затем я отправляю некоторую информацию, которая также будет отображаться в таблице, и вдруг я получаю:

tableView
    Row 1
    Row 2
    Row 3 <- info I just added
    Row 1
    Row 2

Моя реализация numberOfRowsInSection выглядит следующим образом:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [ItemsController sharedItemsController].count;
}

Моя реализация cellForRowAtIndexPath выглядит следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ItemsController* controller = [ItemsController sharedItemsController];
    NSMutableArray* recentItems = controller.listOfRecentItems;

    CustomCell *cell = nil;
    NSUInteger row = [indexPath row];

    if( row < recentItems.count )
    {
        Items*  item = [recentItems objectAtIndex:row];
        if( recentCellData == nil )
            recentCellData = [[NSMutableDictionary alloc] initWithCapacity:[indexPath length]];

        if( [recentCellData count] > 0 )
            cell = [recentCellData objectForKey:[NSString stringWithFormat:@"%d", row]];
        if (cell == nil) {
            UIViewController * view1 = [[UIViewController alloc] initWithNibName:@"CustomCell" bundle:nil];

            cell = (CustomCell*)[view1 view];

            [recentCellData setObject:cell forKey:[NSString stringWithFormat:@"%d",row]];
        }

       // do some other stuff here
    }
    // Set up the cell
    return cell;
}

Какой лучший способ обновить таблицу и избежать дублирования видимых в данный момент строк. Заранее благодарю за помощь!

Ответы [ 3 ]

3 голосов
/ 26 марта 2009

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

2 голосов
/ 26 марта 2009

Вы получите только пять предметов, если tableView:numberOfRowsinSection: вернет 5. Это простой ответ на ваш вопрос, но я вижу здесь другие проблемы. Мне интересно, почему у вас есть этот тест: row < recentItems.count. Это тот же массив, что и [ItemsController sharedItemsController].count? Вам действительно нужно использовать один и тот же массив для обоих методов.

(Кроме того, это не синтаксическая ошибка, но вы не должны использовать синтаксис свойства для вещей, которые не объявлены как свойства. Вместо этого вы должны написать [recentItems count].)

Меня также смущает код, который вы используете для настройки ячейки. Клетки предназначены для повторного использования. То есть вы создаете одну ячейку, а затем каждый раз переконфигурируете ее при реализации tableView:cellForRowAtIndexPath:. Ваш код создает ячейку для каждого элемента в вашем списке. Это очень неэффективно для памяти и, вероятно, приведет к сбою вашей программы из-за недостатка памяти на iPhone, если вы будете хранить в памяти много ячеек, подобных этой.

Рекомендуемый подход - позвонить dequeueReusableCellWithIdentifier:. Если это возвращает nil, то вы настраиваете ячейку, используя инициализатор initWithFrame:reuseIdentifier:. Табличное представление очень умное, и будет просить вас перерисовать ячейку только тогда, когда это необходимо.

Твой recentCellData словарь мне тоже очень не по себе. Что если вы вставите элемент после элемента с ключом @"2"? Все элементы с ключом @"3" должны быть сдвинуты на один элемент вправо, чтобы работать так, как вы ожидаете. Это тонна бухгалтерии, которая мне кажется ненужной. Если вам действительно нужно что-то подобное - и, чтобы быть ясным, я не думаю, что вам это нужно - почему бы вам не использовать NSMutableArray, который намного проще в использовании?

1 голос
/ 26 марта 2009

Я добавил немного больше информации выше.

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