当从一个视图控制器传递到另一个视图控制器(如Instagram或Facebook(时,我试图在表视图中保留单元格的当前IndexPath.row。每次我从一个视图控制器移动到另一个视图控制器时,我都必须调用 reloadData(( 来为表视图加载它。但是当我这样做时,我在转到新的视图控制器之前会失去当前位置。
我可以通过在控制器之间传递当前的 IndexPath.row 来让它在 didSelect 上工作,但如果用户只是滚动,那么尝试这样做就会变得有问题。
任何建议将不胜感激!非常感谢!
默认情况下,reloadData
保留contentOffset
。但是,如果estimatedRowHeight
值不准确,则可以对其进行更新。
在tableView
上调用reloadData
不会更改内容偏移量。但是,如果您使用的是iOS 13中引入的UITableViewAutomaticDimension
,则可能会遇到问题。
在使用UITableViewAutomaticDimension
时,需要编写委托方法tableView: estimatedHeightForRowAtIndexPath:
并返回UITableViewAutomaticDimension
以及同样返回相同的tableView: heightForRowAtIndexPath:
。
对我来说,我在使用它时在 iOS 13 中遇到了问题。这是因为即使我使用的是UITableViewAutomaticDimension
,该方法estimatedHeightForRowAtIndexPath:
方法也返回了不准确的值。这是iOS 13的问题,因为iOS 13设备没有问题。
我通过使用dictionary
来存储单元格高度的值并将其返回来解决此问题。这就是我所做的。
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
NSNumber *key = @(indexPath.row);
NSNumber *height = @(cell.frame.size.height);
[self.cellHeightsDictionary setObject:height forKey:key];
}
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSNumber *key = @(indexPath.row);
NSNumber *height = [self.cellHeightsDictionary objectForKey:key];
if (height)
{
return height.doubleValue;
}
return UITableViewAutomaticDimension;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewAutomaticDimension;
}
正如你所说,你可以保存位置,并在viewDidLoad中滚动到该索引:
tableView.scrollToRow(at: <IndexPath>, at: <UITableView.ScrollPosition>, animated: <Bool>)
将 ANIMATION 设置为 false 并将 scrollPosition 设置为适合 u 的任何内容,例如 .top,并且 indexPath u 只是在视图控制器之间传递。 尝试在 viewDidLoad 或 viewWillApear 中交替使用此函数的位置。