将新项添加到UITableView和Core Data作为数据源?

时间:2010-04-13 03:54:24

标签: iphone

我无法使用核心数据向表格视图中添加新项目。这是我的代码中的简要逻辑。在我的ViewController类中,我有一个按钮来触发编辑模式:

- (void) toggleEditing {
  UITableView *tv = (UITableView *)self.view;
  if (isEdit) // class level flag for editing
  {
    self.newEntity = [NSEntityDescription insertNewObjectForEntityName:@"entity1"
      inManagedObjectContext:managedObjectContext];
    NSArray *insertIndexPaths = [NSArray arrayWithObjects:
      [NSInextPath indexPathForRow:0 inSection:0], nil]; // empty at beginning so hard code numbers here.
    [tv insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationFade];
    [self.tableView setEditing:YES animated:YES]; // enable editing mode
  }
  else { ...}
}

在这段代码中,我首先在我当前的托管对象上下文中添加了一个新项目,然后我向我的tv添加了一个新行。我认为我的数据源或上下文中的对象数量和表格视图中的行数都应为1.

但是,我在tabView:numberOfRowsInSection:

的情况下遇到异常

无效更新:第0节中的行数无效。更新(0)后现有部分中包含的行数必须等于更新前该部分中包含的行数(0) ,加上或减去从该部分插入或删除的行数(插入1个,删除0个)。

在委托事件发生后立即引发了异常:

- (NSInteger) tableView:(UITableView *) tableView numberOfRawsInSection:(NSInteger) section {
  // fetchedResultsController is class member var NSFetchedResultsController 
  id <NSFechedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections]
    objectAtIndex: section];
  NSInteger rows = [sectionInfo numberOfObjects];
  return rows;
}

在调试模式下,我发现行仍为0,并且在toggleEditing之后调用了事件。看起来从fetchedResultsController获取的sectionInfo不包括插入的新实体对象。不确定我是否遗漏了任何东西或步骤?我不确定它是如何工作的:在新实体插入当前托管对象上下文时通知fetcedResultsController或反映更改?

1 个答案:

答案 0 :(得分:0)

我想我得到了一个解决方案。实际上,我不需要在toggleEditing事件中创建实体。然后,在提交插入事件时应创建实体对象。以下是toggleEditing事件中代码的更新:

- (void) toggleEditing {
  UITableView *tv = (UITableView *)self.view;
  if (isEdit) // class level flag for editing
  {
    insertRows = 1; // NSInteger value defined in the class or header
    NSArray *insertIndexPaths = [NSArray arrayWithObjects:
    [NSInextPath indexPathForRow:0 inSection:0], nil]; // empty at beginning so hard code numbers here.
    [tv insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationFade];
    [self.tableView setEditing:YES animated:YES]; // enable editing mode
  }
  else { insertRows = 0; ...}
}

在这种情况下,行会动态插入到当前表视图中。由于添加了新行,在以下委托中,我必须确保该部分中返回的行反映了煽动:

- (NSInteger) tableView:(UITableView *) tableView numberOfRawsInSection:(NSInteger) section {
  // fetchedResultsController is class member var NSFetchedResultsController 
  id <NSFechedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections]
    objectAtIndex: section];
  NSInteger rows = [sectionInfo numberOfObjects];
  return rows + insertRows;
}

然后在委托tableView:numberOfRowsInSection:中,我将附件添加到插入的行,将其标记为Add。

我从这次经验中吸取的教训是,当一行动态添加到表视图时,不需要在托管对象上下文中创建实体对象。仅在事件上创建对象以提交编辑样式(添加)。另一个需要记住的重要事项是,我必须跟踪动态插入或删除的行中的行,如上所述。

顺便说一下,我尝试在我的表视图中添加一行作为添加新实体或数据的UI的原因是基于iPhone的Contact应用程序。我知道添加新实体的最常用方法是在导航栏上显示“添加”按钮,但“联系人”应用程序提供了另一种方法。如果选择一个人并触摸导航栏上的编辑按钮,则会以动画方式在表视图中显示多个添加行。我不确定我的解决方案是否是实现这一目标的正确方法。请纠正我,我想接受任何好的答案!