1

我有一个使用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];
}
4

1 回答 1

-1

-(void)layoutSubviews 方法似乎可以解决问题。谢谢汤姆斯威夫特。

于 2012-09-17T19:56:55.323 回答