1

IBAFormsを使用するアプリがあります。XCode 4.5GM iOS6 シミュレーターで実行すると、アプリがリセットされるIBAFormViewControllerとアプリが頻繁にハングすることがわかりました。formDataSourceFIRSTsetFormDataSourceでは発生しませんが、後続の への呼び出しで発生することに注意してください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];
}
4

1 に答える 1

-1

-(void)layoutSubviews メソッドは修正を行うようです。ありがとうトムスウィフト。

于 2012-09-17T19:56:55.323 に答える