我注意到我的应用中出现了问题,因为UITableView
之前调用viewDidLoad
的数据源方法。
问题是UITableView
没有正确的行数,它从NSFetchedResultsController
得到的行数,但performFetch
“函数”被称为在viewDidLoad
方法中,由于某种原因在数据源方法之后调用。
以下是两种重要方法的来源:
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.allowsSelectionDuringEditing = NO;
self.tableView.editing = YES;
self.title = [NSString stringWithFormat:@"%@", [[game valueForKey:@"title"] description]];
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
如何解决此问题?
答案 0 :(得分:4)
正常的程序流要求在任何-viewDidLoad
数据源方法之前调用UITableView
。如果你以相反的顺序得到它们,那么你的代码库中会有一些东西导致它们被乱序调用。
首先,在此问题中显示的两种方法中加上断点,然后确认,它们将被无序调用。
然后,当您在-tableView:numberOfRowsInSection:
断点时查看堆栈跟踪,并在-viewDidLoad
之前查看为什么被调用。
-viewDidLoad绝对是第一个被调用,如链接所示。当您在该堆栈跟踪中选择[PlayerViewController -viewDidLoad]
行时,它所处的代码行是什么?如果它位于[super viewDidLoad]
那么你的超类是什么,它做什么是-viewDidLoad
?
答案 1 :(得分:-1)
在我目前的应用中,通用代码流程往往是:
(在父控制器中:)
这种方法避免了您遇到的问题。它还意味着显示结果的视图不需要具有搜索逻辑,并且可以重用以显示不同的结果集(尽管通过传入NSFetchRequest可以实现相同的结果)。