我有一个使用IBAForms的应用程序。在 XCode 4.5GM iOS6 模拟器中运行时,我发现应用程序在重置时经常IBAFormViewController
挂起formDataSource
。请注意,它不会发生在 FIRST 上setFormDataSource
,但它确实会发生在后续调用setFormDataSource
.
我将问题缩小到 IBAForms 用来使屏幕外表格视图单元格与 UIResponder 链(“ hiddenCellCache
”)一起使用的 hack。基本上,当单元格被 UITableView 重新设置为 nil 时,它们会将自己置于隐藏窗口中。
当我禁用此过程(如下所示的更改)时,我的挂起消失了。
我的理论是 iOS6 表格视图有一些新的优化来清理隐藏的单元格,这些单元格现在不知何故与 IBAForms 的 hiddenCellCache 不兼容。 但我想更好地理解这一点。
作为参考,以下是我对 IBAForms 所做的更改。如果它们被证明运行良好,我会将它们提交回 GitHub 上的项目。
IBAFormFieldCell.m:
// change is to remove an assert on hiddenCellCache
- (void)didMoveToWindow {
if (self.window == nil) {
[self.hiddenCellCache addSubview:self];
}
}
IBAFormViewController.m:
// this setter also sets the datasource of the tableView and reloads the table
- (void)setFormDataSource:(IBAFormDataSource *)dataSource {
if (dataSource != formDataSource_) {
//$$TS modified to work with iOS6
for (IBAFormFieldCell* c in self.hiddenCellCache.subviews)
{
c.hiddenCellCache = nil;
[c removeFromSuperview];
}
IBAFormDataSource *oldDataSource = formDataSource_;
formDataSource_ = [dataSource retain];
IBA_RELEASE_SAFELY(oldDataSource);
self.tableView.dataSource = formDataSource_;
[self.tableView reloadData];
}
}
我的问题是:
- 健全性检查 - 这对其他人来说是个问题吗?
- 导致它在iOS6中中断的hiddenCellCache hack是什么?
编辑:这是另一个更简单的“修复”。当我在分析器中运行应用程序时,我注意到在挂起期间应用程序将所有时间都花在 UITableViewCell layoutSubviews 中。我还是不明白为什么。
- (void) layoutSubviews
{
if ( self.superview == self.hiddenCellCache )
return;
[super layoutSubviews];
}