insertRowsAtIndexPath tableView не вызывает cellForRowAtIndexPath tableView - PullRequest
1 голос
/ 31 августа 2011

У меня есть UITableViewController с кнопкой редактирования.При нажатии на него пользователь может удалить или добавить строки в UITableView.Удаление строк работает нормально.Но когда я хочу добавить новую строку, я получаю короткую анимацию пустой ячейки, идущей слева, и когда анимация заканчивается, табличное представление выглядит точно так же, как и до вызова метода.Когда я добавляю новую ячейку, я добавляю новый объект в массив данных, который передает представление моей таблицы, а затем добавляю ячейку.Этот массив данных обновляется.Поэтому, если я позвоню [tableView reloadData] после добавления новой ячейки, я получу возможность увидеть новую ячейку, но без анимации.И мне бы очень хотелось иметь анимацию.

У меня есть рабочий пример того же.Я понял, что после вызова tableView:commitEditingStyle:forRowAtIndexPath: автоматически вызывается метод источника данных табличного представления tableView:cellForRowAtIndexPath:.В моем случае это не так.Я думаю, это причина, почему я не вижу новую камеру.Любые идеи, почему это происходит?

Это мой `tableView: commitEditingStyle: forRowAtIndexPath:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    {
        // Delete the row from the data source
        [self.tableData removeObjectAtIndex:[indexPath row]];

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:self.tableData forKey:self.key];
        [defaults synchronize];

        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) 
    {
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
        UITextField *textField = (UITextField *)[[cell contentView] viewWithTag:kTextFieldTag];
        NSString *textFieldText = [textField text];
        if (textFieldText != nil) 
        {
            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
            NSString *string = [[NSString alloc] initWithString:textFieldText];
            [self.tableData addObject:string];
            [string release];

            NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
            [defaults setObject:self.tableData forKey:self.key];
            [defaults synchronize];

            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];   

            // If reloadData is being called, the new cell is displayed but without the animation
            // [tableView reloadData]; 
        } 
        else
        {
            // Display alert view
            // Code for displaying an AlertView
        }
    }   
}

Ответы [ 2 ]

2 голосов
/ 31 августа 2011

Попробуйте заключить вызов вставки в [tableView beginUpdates] [tableView endUpdates].Из документов:

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

[tableView beginUpdates];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationLeft];
[tableView endUpdates];
1 голос
/ 27 января 2013

У меня такая же проблема.Из того, что я могу сказать, UITableView вызывает cellForRowAtIndexPath, только если считает, что изменяемая ячейка видима.Поскольку вы добавляете новую ячейку, я предполагаю, что таблица не считает ее видимой и, следовательно, не вызывает метод.Решение Jaminguys работает для меня, но это немного похоже на ошибку в UIKit.

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

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