1

我有一个支持 iOS 7.1 及更高版本的应用程序。当用户选择一个单元格并在详细视图上进行字段更改时,tableView 行将被重新加载以反映导航返回时的更改。在它的故事板中,这个单元格有几个自动布局约束。该单元格仅包含 9 个 UILabel,但具有不同点大小的非默认字体。

行更新已在运行 iOS 7.1.2、8.4.1 和 9.0.2 的设备上验证正常工作。此外,我已经在 8.1、8.2 和 8.3 的模拟器中对其进行了测试。但是,如果在 9.1 上失败,并且用户在 iOS 更新发布后报告了这一点。设备和模拟器都失败了。

失败是整个单元格的情节提要自动布局约束丢失。在仅对更新的行调用 reloadRowsAtIndexPaths 之后,所有单元格标签会在混乱中相互覆盖。一个单元格的问题一直存在,直到再次从核心数据重新加载整个表格(拉动刷新)。此时它将具有用户所做的更新值。

为了解决这个问题,我对调用执行了以下操作:

// work around cell layout bug introduced with iOS 9.1
  if (SYSTEM_VERSION_LESS_THAN(@"9.0.3"))
      [self.tableView reloadRowsAtIndexPaths:@[selectedRowIndexPath] withRowAnimation:UITableViewRowAnimationNone];

这只是一个版本检查宏。在用户从详细视图返回并更改其值后,在 tableView 的 viewWillAppear 中调用此代码。此解决方法可避免该问题。

为了确保我们可以在丢失值之前重新加载,viewWillAppear 的开头也总是有这些行:

// we need to save this before the super clears it
NSIndexPath *selectedRowIndexPath = [self.tableView indexPathForSelectedRow];
[super viewWillAppear: animated];

该应用程序是使用 Xcode 7.1 使用故事板和大小类构建的。Xcode 7.1.1 也存在问题。用法在 UITableViewController 中。

只有我或其他人看到了这种行为变化吗?

4

0 回答 0