これがどのように機能するのか理解できません。UITableView dequeueReusableCellWithIdentifier TheoryやHow does dequeueReusableCellWithIdentifier: work?など、SO に関する多くのスレッドを読みました。.
ただし、私の UITableView は、最初に読み込まれたときでも、毎回セルを正常にデキューします (nil になることはありません)。似たようなセルは同じ識別子を使用するべきだという印象を受けていたので、必要なものを変更するだけで済みます。
なぜなら
if (!cell) {
NSLog(@"New cell");
cell = [[UITableViewCell alloc] initWithStyle:someStyle reuseIdentifier:someIdentifier];
}
スタイルは初期化子でのみ設定できるため、同じテーブル内のセルを異なるスタイルで処理する方法がわかりません。
また、別のセル識別子を使用して、別のテーブルなどのセルを再利用していないことを確認しました。これらの識別子を登録しています[tableView registerClass: forCellReuseIdentifier:]
私が理解している場合、このメソッドは、以前に作成され、画面から移動されたセルのみを返す必要があります (非表示、つまり再利用できます)。では、なぜ最初に呼び出されたときにセルを返すのでしょうか?
編集:したがって、混乱は[tableView dequeueReusableCellWithIdentifier: forIndexPath:]
代わりに使用[tableView dequeueReusableCellWithIdentifier:]
されていました(最初は識別子を登録する必要があり、2番目は何も利用できない場合はnilを返します-私が上記で期待していた動作)。
しかし、コードを use に変更する[tableView dequeueReusableCellWithIdentifier:]
と、新しいセルが作成され、そのcontentView.frame
幅が 320 (全幅) になっていることに気付きました。以前は、dequeue...forIndexPath
302 の幅、またはセルの視覚的/「実際の」幅を与えていました。どうしてこれなの?
また、再利用のために登録された UITableViewCells のスタイルを指定する方法はありますか?
解決策:だから私はこのスレッドUITableView cell.contentView.bounds.size.width Changes With Cell Reuseを見つけました。これは、autoresizingmask を UIViewAutoresizingFlexibleLeftMargin に設定すると、相対的な配置を試みると修正されることを示しています(contentView の幅は最初は全幅です) 、しかし、それを提示すると縮小されるので、正しく計算すれば正しく表示されます)。
UISwitch を右側に配置していました。自動サイズ変更マスクを設定すると、最初に表示されたときに機能しますが、切り替えたときにさらに約 20 ピクセル移動しました。その余分なシフトの原因はわかりませんが、UISwitchをセルのaccessoryViewとして設定するだけで解決しました。
(これは元の質問から部分的に外れていますが、誰かがこれに出くわした場合は役立つかもしれません)。元の質問について特に疑問に思っている人のために、答えは最初の編集の下にあります。