【发布时间】:2023-03-18 01:06:02
【问题描述】:
我有一个带有 TableView 的 UIViewController 用于显示“清单”项目。这个 ViewController 还有一个按钮,可以触发 segue 以模态方式呈现另一个 UIViewController,供用户添加新的清单项。
所有清单项目都存储在 CoreData 中。
新的CoreData 实体由SecondViewController 创建和存储。用户可以在点击触发解除SecondViewController 的按钮之前添加任意数量的checklist 项目。在这里,由于这个SecondViewController 是模态呈现的,我假设它的活动与FirstUIViewController 根本没有任何关系。
在包含UITableView 的FirstViewController 处,有一个NSFetchedResultsController 再次在CoreData 执行获取请求并将所有数据提供给UITableView。 NSFetchedResultsController 的委托也指向这个FirstUIViewController。
问题是,在SecondViewController被解雇后,UITableView似乎注意到了新清单实体的插入,并在UITableView中插入了新的UITableCell。然而,奇怪的是,这个新插入的行没有显示正确的cell.textlabel。仅显示标签上没有任何内容的空白UITableViewCell。
下面是我如何配置UITableViewCell。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"ChecklistCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
[self configureCell:cell atIndexPath:indexPath];
return cell;
}
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
ChecklistItem *item = [self.fetch_controller objectAtIndexPath:indexPath];
cell.textLabel.text = item.name;
}
这是我为 NSFetchedResultsControllerDelegate 提供的内容
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
{
switch (type) {
case NSFetchedResultsChangeInsert:
NSLog(@"*** controllerDidChangeObject - NSFetchedResultsChangeInsert");
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
强制[self.tableView reloadData] 似乎有帮助。我知道这一点,因为我添加了一个按钮来调用此方法,并且单元格的标签相应地刷新和更新。
因此,我尝试了这个,因为我希望它会在 SecondViewController 被解雇后被调用。但是,该方法被调用是因为 Reload Data! 已被记录,但不知何故 tableView 仍然没有正确显示新添加的单元格的标签。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self performFetch];
[self.tableView reloadData];
NSLog(@"Reload Data!");
}
我想知道这里可能有什么问题。不知何故,self.tableView 在解雇SecondViewController 后不会重新加载。有什么建议吗?
好的,更奇怪的是我在- (void)viewDidAppear:(BOOL)animated 中尝试了[self.tableView reloadData]。新的 tableViewCell 仍然不能正确显示它的标签;然而,在等待 30 秒后,标签就神奇地弹出了!这是否意味着我的 iPhone/iPhone 模拟器需要时间思考?
【问题讨论】:
-
您是否将数据保存在模态视图控制器中?
-
是的,SecondViewController 处理所有的保存过程。 FirstViewController 只是获取并显示数据。
-
你实现了controllerWillChangeContent并调用了[self.tableView beginUpdates]?在实现 controllerDidChangeContent 时,您还需要一个 [self.tableView endUpdates]。
-
@bbarnhart 我确实有他们两个。委托代码有点长,这里就不一一贴了。我想我需要想办法在所有新的清单项通过使用这些委托方法正确插入后得到通知。
-
从 viewWillAppear 中删除所有代码。这些都不需要。接下来,将 NSLog 消息添加到插入期间将被命中的每个方法。此跟踪应该可以帮助您查看未调用的内容。
标签: ios uitableview core-data nsfetchedresultscontroller segue