Добавление строки вставки в tableView - PullRequest
0 голосов
/ 05 мая 2010

У меня есть tableView, который загружает свои данные непосредственно из таблицы базовых данных с помощью NSFetchedResultsController. Я не использую промежуточный NSMutableArray для хранения объектов из результатов выборки;

Я в основном реализовал в своем UITableViewController метод протокола numberOfRowsInSection, и он возвращает числоOfObjects внутри NSFetchedResultsSectionInfo.

id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];

и затем я настраиваю содержимое ячейки путем реализации configureCell: atIndexPath и извлечения информации об объекте из fetchedResultController, но сейчас у меня есть общая конфигурация для любого объекта (чтобы избежать осложнений)

cell.textLabel.text = @"categoria";

У меня также есть панель навигации с пользовательской кнопкой редактирования справа, которая загружает мой собственный селектор под названием customSetEditing. То, что я пытаюсь сделать, это загрузить «Вставить ячейку» в начале tableView, поэтому, когда я нажимаю на него, он создает новую запись. Эта последняя часть легко реализуется, проблема в том, что я не могу загрузить строку вставки или любую строку, когда нажимаю на кнопку редактирования на панели навигации.

это код для моего customSetEditing:

- (void) customSetEditing {
            [super setEditing:YES animated:YES];
            [self.tableView setEditing:YES animated:YES];
            [[self tableView] beginUpdates];
            //[[self tableView] beginUpdates];
            UIBarButtonItem *customDoneButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(customDone)];
            [self.navigationItem.rightBarButtonItem release];
            self.navigationItem.rightBarButtonItem = customDoneButtonItem;
            //[categoriasArray insertObject:[NSNull null] atIndex:0];
            NSMutableArray *indexPaths = [[NSMutableArray alloc] initWithObjects:[NSIndexPath indexPathForRow:0 inSection:0],nil ];
            [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop];
            //[indexPaths release];
            [self.tableView reloadData];}

Перед добавлением: [self.tableView reloadData]; Я получил ошибку выхода за границы плюс сбой программы, и хотя программа не падает, она ничего не загружает.

Я видел много примеров подобных ситуаций в stackoverflow (кстати, это отличный форум с очень полезными и приятными людьми), ни один из примеров, похоже, не работает для меня.

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 06 мая 2010

Ваш -configureCell:atIndexPath: не должен вызываться, если ваша таблица пуста. Как выглядит ваш -tableView:rowsInSection: метод?

0 голосов
/ 08 мая 2010

это код (извините за беспорядок, я, кажется, не понял, как исправить это для stackoverflow):

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // Return the number of rows in the section. id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section]; if (self.tableView.editing) { return ([sectionInfo numberOfObjects]+1); } return [sectionInfo numberOfObjects]; }

0 голосов
/ 05 мая 2010

Вы знаете, я только что узнал, что приложение сбойно в комментариях в этом методе:

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    //NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = @"categoria";
}

Это работает, если я прокомментирую строку. Это может быть из-за того, что в контроллере извлеченных результатов вообще нет данных, мне нужна эта строка, поэтому я попытался:

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
            if (![fetchedResultsController objectAtIndexPath:indexPath]) {
                cell.textLabel.text = @"categoria";
            }
            else{
                NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:indexPath];
                cell.textLabel.text = @"categoria";
            }

}

Но все равно вылетает.

...