我正在使用NSFetchedResultsController从我的CoreData商店加载一系列本地对象。加载对象后,我试图向下滚动主UITableView,以便最后一行显示在屏幕底部。但是,当我调用此方法时,最顶部的一行或多行是不可见的,但当用户将tableview移动几个像素时,单元格会重新出现。请问你能告诉我为什么会这样吗?
- (void) scrollToBottomAnimated:(BOOL) animated {
if ([self.fetchedResultsController fetchedObjects].count > 0) {
NSInteger section = [self.tableView numberOfSections] - 1;
NSInteger item = [self.tableView numberOfRowsInSection:section] - 1;
NSIndexPath *lastIndexPath = [NSIndexPath indexPathForRow:item inSection:section];
[self.tableView scrollToRowAtIndexPath:lastIndexPath atScrollPosition:UITableViewScrollPositionTop animated:animated];
}
}
这个带注释的屏幕截图总结了应该发生的事情:http://d.pr/i/VNyE+
编辑 - 截断-viewDidLoad方法
- (void)viewDidLoad {
[self.navigationItem setTitle:@"My Notes"];
[self.navigationItem setRightBarButtonItem:[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"870-smile"] style:UIBarButtonItemStyleBordered target:self action:@selector(showLoginOrProfile:)]];
[self.tableView registerClass:[PSSpaceCell class] forCellReuseIdentifier:PSSpaceCellReuseIdentifier];
[self.tableView registerClass:[PSReusableHeaderView class] forHeaderFooterViewReuseIdentifier:PSSpaceHeaderReuseIdentifier];
[self.tableView setBackgroundColor:[UIColor whiteColor]];
[self.view addSubview:self.tableView];
[super viewDidLoad];
NSError *error;
if (![self.fetchedResultsController performFetch:nil]) {
NSLog(@"Error performing fetch: %@", error);
}
[self scrollToBottomAnimated:NO];
}
- (UITableView *) tableView {
if (_tableView == nil) {
_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - [self toolbar].frame.size.height) style:UITableViewStyleGrouped];
[_tableView setDelegate:self];
[_tableView setDataSource:self];
[_tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
[_tableView setIndicatorStyle:UIScrollViewIndicatorStyleBlack];
[_tableView setShowsVerticalScrollIndicator:YES];
[_tableView setSectionFooterHeight:0];
[_tableView setKeyboardDismissMode:UIScrollViewKeyboardDismissModeInteractive];
}
return _tableView;
}
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
PSSpaceCell *cell = [tableView dequeueReusableCellWithIdentifier:PSSpaceCellReuseIdentifier];
PSSpace *space = [self.fetchedResultsController objectAtIndexPath:indexPath];
[space setLeadsBeingLoaded:[self.spaceUIDsGettingLeads containsObject:[space spaceUID]]];
[space setHasLeads:[self leadsAvailableForSpace:space]];
[cell setSpace:space];
[cell setBackgroundColor:[UIColor whiteColor]];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
return cell;
}
答案 0 :(得分:0)
在查看代码之后,我可以说,“如果”,如果以下语句未能在方法中返回reusableCell:
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
/// what will happen if this returns a nil ?
PSSpaceCell *cell = [tableView dequeueReusableCellWithIdentifier:PSSpaceCellReuseIdentifier];
...
...
}
如果没有这样的可重复使用,请提供一种制作新单元格的方法。
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
PSSpaceCell *cell = [tableView dequeueReusableCellWithIdentifier:PSSpaceCellReuseIdentifier];
if(cell == nil ) {
cell = [[PSSpaceCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:PSSpaceCellReuseIdentifier];
}
PSSpace *space = [self.fetchedResultsController objectAtIndexPath:indexPath];
[space setLeadsBeingLoaded:[self.spaceUIDsGettingLeads containsObject:[space spaceUID]]];
[space setHasLeads:[self leadsAvailableForSpace:space]];
[cell setSpace:space];
[cell setBackgroundColor:[UIColor whiteColor]];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
return cell;
}
我希望能解决这个问题。
答案 1 :(得分:0)
由于您使用的是新的iOS 7行高估计工具(使用tableView:estimatedHeightForRowAtIndexPath:
委托方法,或在表格视图中设置estimatedRowHeight
属性),因此您很遗憾遇到了Apple的错误滚动到表视图的顶部或底部时的实现。
请参阅此主题以获取与其他开发人员讨论同一问题的讨论,以及一些可能的解决方法:
https://github.com/caoimghgin/TableViewCellWithAutoLayout/issues/13
我也在这方面向Apple提交了雷达(15283329)。