1

IB を使用してUITableView作成したプロトタイプ セルがあります。私はUILabelこのプロトタイプセルに を持っています。メソッドUILabelを使用して識別できるように、タグ値 5 をこれに設定しました。viewForTag:このような20の私有財産も定義しました

@property(nonatomic, strong) UILabel *label_1;
@property(nonatomic, strong) UILabel *label_2;
.
.
.
@property(nonatomic, strong) UILabel *label_20;

今、からセルを作成しているcellForRowAtIndexPath:ときUILabelに、self.label_1 = (UILabel*)[cell viewForTag:5];//5 is the Tag value i have setup using IB.

今まですべて順調です。このアプリを実行すると、16 までのプロパティに適切な値があり、残りは null であることがわかります。これは、最初の 16 個のセルのみが描画されたため、残りのプロパティには対応する が割り当てられていないためUILabelです。ここまでは大丈夫です。テーブルをスクロールすると、残りの 4 つのセルが画面上に表示され、最初の 4 つのセルが画面外に表示されます。NSLog(@"%@",self.label_1.text)今、各プロパティの値を(.を使用して)印刷すると、対応するラベルが画面上にあるプロパティは正しい値を出力しますが、オフスクリーンのプロパティはランダムな値を出力します(nullではなく、ランダムな値だけで、オフにすることができます他のプロパティも。)

通常のシナリオでは、最初に頭に浮かんだのは、行がオフスクリーンになるとすぐに割り当てが解除され、プロパティがランダムな場所 (ダングリング ポインター) を指していることです。しかし、ここで私の場合、プロパティは、strongこのポインターが存在するまで、対応する UILabel の割り当てを解除しないようにするためです。ここで何が起こっているのか誰か説明してもらえますか?

4

2 に答える 2

2

メモリを節約するために、UITableViewリサイクルしますUITableViewCells。を呼び出すと、セルがリサイクルされますtableView dequeueReusableCellWithIdentifier:

私の推測では、、、label_1 == label_17などlabel_2 == label_18です。

これらのラベルを更新する必要がある場合は、デザインを再考する必要があります。すべての更新は で行う必要がありますtableView:cellForRowAtIndexPath:。セル内のデータを更新する必要がある場合は、 を呼び出して、 のメソッド[tableView reloadData]内でラベルの正しい値を設定する必要があります。tableView:cellForRowAtIndexPath:UITableViewDataSource

于 2013-10-04T17:26:33.907 に答える
0

細胞は再利用されています。10 個のセルが 1 つの画面に収まるとしましょう。下にスクロールすると、最初のセルが消え、11 番目のセルが表示されます。セルごとに新しいビューを作成する代わりに、tableview はキューを保持し、そこからセルをデキューします。これは、5 行目のセルを使用して、16 行目またはその他の行を表示することもできることを意味します。セル ビュー (およびそのサブビュー) が画面から消えると、実際にはわかりません。また、セル ビュー (およびそのサブビュー) を制御することもできません。また、動的セル内のビューへの強力なポインタを保持するべきではありません。細胞が静的であれば、まったく問題ありません。代わりに、ロジックを tableView:cellForRowAtIndexPath: に移動してください。そうすれば、特定の indexPath を持つセルが画面に表示されていることがわかり、それに応じて操作できます。

于 2013-10-04T19:59:05.677 に答える