IBAFormsを使用するアプリがあります。XCode 4.5GM iOS6 シミュレーターで実行すると、アプリがリセットされるIBAFormViewController
とアプリが頻繁にハングすることがわかりました。formDataSource
FIRSTsetFormDataSource
では発生しませんが、後続の への呼び出しで発生することに注意してくださいsetFormDataSource
。
私は問題を、IBAForms が画面外のテーブル ビュー セルを有効にして UIResponder チェーン (" hiddenCellCache
") を操作できるようにするために使用するハックに絞り込みました。基本的に、セルは 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ハックについてはどうですか?
編集:これは別のより簡単な「修正」です。プロファイラーでアプリを実行すると、ハング中にアプリがすべての時間を UITableViewCell layoutSubviews で費やしていることに気付きました。理由はまだわかりません。
- (void) layoutSubviews
{
if ( self.superview == self.hiddenCellCache )
return;
[super layoutSubviews];
}