1

テーブルのセル ビューに XIB を登録しています。UIImageViewといくつかのUILabelを備えた、空想的ではなく、非常に単純な小さなセルビューです。物事は期待どおりに機能しますが、スクロールすると多くのスタッター/ヒッチングが発生します。プロファイリングを行ったところ、 [UITableView _dequeueReusableTyper:withIdentifier:] に多くの時間が費やされているようです。cellForRowAtIndexPath メソッドからのすべてのコードをコメントアウトしましたが、セルのデキューとリターンだけを除き、スタッターはまだ残っています。したがって、犯人は確かにこのデキュー コール スタックです。しかし、XIB のセル ビューを単純化する以外に、これを最適化してスムーズに実行する方法がわかりません。これはオプション (または難しいもの) ではない可能性があります。ここで試してみるべき何かが欠けていますか?

デキュー コード:

UIMyTableViewCell *cell = [table dequeueReusableCellWithIdentifier:@"MyTableCell"];
if (cell == nil)
{
    UINib *nib = [UINib nibWithNibName:@"UIMyListTableCellView" bundle:nil];
    [table registerNib:nib forCellReuseIdentifier:@"MyTableCell"];
}
cell = [table dequeueReusableCellWithIdentifier:@"MyTableCell"];
4

2 に答える 2

1

スタッターを取り除き、高いスクロール フレームレートを得ることができました。同様の問題を抱えている他の人にとって、問題はテーブルセルにカスタム XIB を使用することにありました。どうやらこのコード パスは最適化されていないか、何かバグがあります。カスタム テーブル セルに独自の drawRect メソッドを実装することでこれを置き換えたところ、今では全速力で燃えています。

于 2013-06-21T18:47:08.410 に答える
0

returnの-registerNib:forCellReuseIdentifier:たびに呼び出します。[self.tableView dequeueReusableCellWithIdentifier:@"MyTableCell"]nil

self.tableViewで始めてから に切り替えるのはなぜtableですか? これらは同じオブジェクトですか?

それらが同じオブジェクトでない場合、 then[self.tableView dequeueReusableCellWithIdentifier:@"MyTableCell"]は常に戻りnil、常に を呼び出し-registerNib:forCellReuseIdentifier:ます。


繰り返し呼び出しに対する保護をラップするか-registerNib:forCellReuseIdentifier:、別の方法に移動してみてください。-viewDidLoad

@property (assign, nonatomic) BOOL nibRegistered;

…</p>

if (!self.nibRegistered) {
    self.nibRegistered = YES;
    UINib *nib = [UINib nibWithNibName:@"UIMyListTableCellView" bundle:nil];
    [table registerNib:nib forCellReuseIdentifier:@"MyTableCell"];
}
于 2013-06-19T00:15:43.930 に答える