【问题标题】:Is it possible to prevent uitableviewcell to unload on device rotation?是否可以防止 uitableviewcell 在设备旋转时卸载?
【发布时间】:2014-01-05 00:33:54
【问题描述】:

编辑: 简而言之: 如何防止uitableview在旋转时调用cellForRowAtIndexPath?


我有 uitableview 的全屏模式。 在该模式下,每个单元格都是 ipad 屏幕的大小。 uitableview 和单元格正在使用转换进行水平滚动。 uitableview 设置为 pagingEnabled = YES

当我旋转设备时,我会布置所有框架/实体并调用

开始更新 结束更新

不调用 reloadData,这只会更新单元格高度。

在旋转开始之前,我保存了当前可见单元格的索引路径 ,然后,在 willAnimate..rotate..method 中,我滚动到那个 indexpath,这样用户就会看到正确的单元格。

问题出在某些情况下,特别是如果 uitableview 滚动条位于表格中间,则 uitableviewcell 将卸载,而 uitableview 将加载不同的 uitableviewcell。

我的问题是: 我想知道是否有什么可以告诉 uitableview 在旋转时不要“触摸”单元格/重新加载/卸载。

我知道机会很低,但我想知道其他人如何处理当前可见单元格具有复杂界面 + 正在播放视频等情况,并且您不想在旋转时停止活动,用简单的方法来做到这一点。

希望我在这里很清楚。

【问题讨论】:

  • 单元格未卸载。它们被重复使用。
  • 如果我理解正确,您不希望 cellForRowAtIndexPath 在更改方向时更改可见单元格中的数据?
  • @PetroKorienev 你是对的。我的意思是防止可见单元格,如果旋转则不能重复使用。
  • @Refael.S mmmm 一种查看方式是如何防止 uitableview 在旋转时调用 cellForRowAtIndexPath。

标签: ios uitableview


【解决方案1】:

我认为你不能阻止重复使用。您可以重复使用单元格的智能(例如,旋转前保存单元格的内容/旋转后恢复)。对于正确的定位:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)io
{
    [self saveContentOfCells:[self.tableView indexPathsOfVisibleCells]];
    self.lastVisible = [[self.tableView indexPathsOfVisibleCells] lastObject];
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)io
{
    [self.tableView scrollToRowAtIndexPath:self.lastVisible atScrollPosition:UITableViewScrollPositionBottom];
}

- (UITableViewCell*)tableView:(UITableView*)tv cellForRowAtIndexPath:(NSIndexPath*)ip
{
    // dequeue cell
    // try to restore content if any, clear restoration info
    // if no restoration info setup cell
    // return cell
}

【讨论】:

  • 我拥有某个对象中的所有内容,问题是单元格处于活动状态,这意味着播放视频或发出 Web 请求。将单元格视为您不想破坏的 uiviewcontroller,只是因为它已旋转。读完这里之后,我想可能在旋转之前将可见单元格保存在属性中,然后,如果 cellForIndexPath 调用检查:如果 indexpath 是 visibleCell indexpath,则返回它。如果不是,则创建新单元格并且不要重复使用单元格。(仅用于旋转)。旋转结束后,销毁所有旋转单元格。但我不确定。
  • 你不明白。你知道物体什么时候被销毁吗?当没有任何东西对它们有强烈的引用时。因此,当您保存对所有关键内容的引用时,它不会被释放。您可以保存:嵌入到单元格中的 MPMoviePlayer、整个单元格、URLConnection 对象等。通过保存我的意思是,是的,将它们存储到 strong 属性。
  • 您的单元格没有被破坏,它只是被重复使用并再次设置新数据或相同数据!试试我用 isRotating BOOL 属性写给你的答案,告诉我它是怎么回事
  • 你也没有得到。如果小区有视频播放呢?
  • 这样的,是的。比如说,单元格包含 MPMoviePlayerController 的实例,您可以像往常一样重用它们,但是您的 VC 中存储了 MPMoviePlayerController,您不必为单元格创建它,而是使用存储的。
【解决方案2】:

尝试向 viewController 添加一个名为 isRotating 的 BOOL 属性,并将 isRotating 设置为 YES 旋转时,在旋转结束时将 isRotating 设置回 NO。 使用 CellForRowAtIndexPath 中的 isRotating 将所有数据设置到重用单元格并将所有这些代码行放入 if 中。

仅以更改 textLable 文本的单元格为例:

if (!isRotating)
{
    cell.textLable.text = @"newData";
}

这也许对你有用。

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多