在我的应用中遇到几个表视图的问题。
当表的内容发生变化(因此tableview的内容变大)时会出现问题。
由于某种原因,UITableView的contentSize保持不变,这意味着我无法滚动查看新内容。
当特定单元格变大(在[tableView reloadData];之后)或添加新单元格时(使用NSFetchedResultsController委托方法),会发生这种情况。
我是否需要为tableView重新调整其contentSize做什么?
编辑以显示代码,但这只是样板NSFetchedResultsController委托代码......
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
// The fetch controller is about to start sending change notifications, so prepare the table view for updates.
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:(OJFPunchListCell*)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray
arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray
arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id )sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
switch(type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
// The fetch controller has sent all current change notifications, so tell the table view to process all updates.
[self.tableView endUpdates];
}
我之前在iOS5中做过这种事情,从来没有遇到过问题。似乎这可能是iOS6的变化?
:: EDIT ::
关于这一点的愚蠢之处在于我在同一个应用程序中有许多其他UITableViewControllers,它们都运行良好。我可以添加新的单元格,添加动态大小的单元格,调整单元格大小等...并且所有表格都可以在所有内容中上下滚动。
这个问题现在发生在我最近添加的几个tableview上。
:: EDIT ::
好的,只是做一些调试。当我第一次进入表格视图时,contentSize.height是594。
当我添加一个新项目并返回到同一个tableviewController时,contentSize.height为749。
但是,我无法滚动查看tableView底部新添加的单元格。它只是不会滚动到那里。它在旧的contentSize高度反弹。
答案 0 :(得分:20)
我遇到了同样的问题并最终解决了这个问题。我在contentSize
[self.tableView endUpdates];
[self.tableView endUpdates];
NSLog(@"%f", self.tableView.contentSize.height);
self.tableView.contentSize = [self.tableView sizeThatFits:CGSizeMake(CGRectGetWidth(self.tableView.bounds), CGFLOAT_MAX)];
NSLog(@"%f", self.tableView.contentSize.height);
[self.tableView setContentInset:UIEdgeInsetsMake(50, 0, -50, 0)];
答案 1 :(得分:1)
使用带有两个子VC的自定义视图控制器时遇到了同样的问题,一个是tableview + fetched results controller。
在从一个vc添加内容并回到我的桌面后,我将无法滚动到底部的新内容。
因此,在我的tableview + fetched results controller中,我根据所拥有的对象数量调整内容大小,无论它们来自何处。
最糟糕的情况是,在显示VC时我没有添加任何内容,但成本很低。
//In my tableview + fetched results controller class
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSUInteger objCount = self.fetchedResultsController.fetchedObjects.count;
//My custom cell has a height of 50.0f, yours may not!
CGFloat tableHeight = objCount * 50.0f;
NSLog(@"%i objects, total height: %f",objCount,tableHeight);
[self.tableView setContentSize:CGSizeMake(self.tableView.contentSize.width, tableHeight)];
}
答案 2 :(得分:0)
我有动态tableView和' UITableViewAutomaticDimension'。发生了一些事情,重新加载后,它的内容大小等于其帧大小。在我手动将内容大小设置为表格大小之后,一切正常。我希望这会有所帮助。
table.beginUpdates()
table.contentSize = CGSize(width: table.bounds.width, height: table.bounds.height)
table.endUpdates()
这是在我完成table.reloadData()
之后答案 3 :(得分:-2)
试试这个:
我遇到了类似的问题。在我的情况下,我将一个tableview拖到一个自定义的视图控制器上,由一个推送segue呈现。如果tableview中显示的数据量超过某个数字,那么我可以& #39;触摸桌面视图底部的单元格。
已经尝试了很多方法:设置表视图的框架/内容大小,并且没有一个适用于我。最后,我找到了根本原因并以一种简单的方式解决它(虽然不是优雅地)。
首先,根本原因:IB创建的表视图的宽度大于其父视图控制器的宽度。因此,不会触及视图范围之外的任何单元格。
所以,解决方案很简单:转到StoryBoard,调整表视图的宽度,使其小于父视图的宽度。似乎如果一个表视图由StoryBoard创建,则无法更改它的代码框架。这是我迄今为止所发现的。我想这是StoryBoard的错误。
希望它对你有用。