滚动时UITableViewCells没有被绘制到屏幕上

时间:2014-01-06 19:02:29

标签: ios objective-c core-data uitableview

我正在使用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;
}

2 个答案:

答案 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)。