在tableView中添加Insert Row

时间:2010-05-05 16:00:03

标签: uitableview core-data insert

我有一个tableView,它使用NSFetchedResultsController直接从Core Data表加载其数据。我没有使用中间NSMutableArray来存储获取结果中的对象;

我基本上在我的UITableViewController里面实现了协议方法numberOfRowsInSection,并在NSFetchedResultsSectionInfo中返回numberOfObjects。

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

然后我通过实现configureCell:atIndexPath并从fetchedResultController检索对象信息来配置单元格内容,但是现在我对任何对象都有一个通用配置(以避免复杂化)

cell.textLabel.text = @"categoria";

我还有一个NavigationBar,右边有一个自定义编辑按钮,可以加载我自己的名为customSetEditing的选择器。我想要完成的是在tableView的开头加载一个“Insert Cell”,这样当我点击它时,它会创建一个新的记录。最后一部分很容易实现,问题是当我点击导航栏编辑按钮时,我似乎无法加载插入行或任何行。

这是我的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 :(得分:0)

您知道我刚刚发现应用程序在此方法中的注释行崩溃了:

- (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";
            }

}

但仍然崩溃。

答案 1 :(得分:0)

如果您的桌子为空,则不应调用-configureCell:atIndexPath:。您的-tableView:rowsInSection:方法看起来像什么?

答案 2 :(得分:0)

这是代码(抱歉我不知道如何解决堆栈溢出问题):

- (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]; }