当从一个视图控制器转到另一个视图控制器(如 Swift 中的 Instagram 或 Facebook)时,如何在表视图



当从一个视图控制器传递到另一个视图控制器(如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 中交替使用此函数的位置。

相关内容

  • 没有找到相关文章

最新更新