0

グループ化されたテーブルビューとセルを含むNibファイルがあります。セルはアウトレットを介してUITableViewControllerに接続されています。で、そのcellForRowAtIndexPathセルを返すだけで、テーブルビューに単一のセルが表示されます。しかし、テーブルの行数を2に変更して同じセルを表示したい場合、1つしか表示されません。表示されているセルの下隅が丸くないため、2番目のセルがそこにあるように見えます。しかし、それはありません。

nibファイルの2番目のセルオブジェクト、2番目のアウトレットを作成し、それを2番目の行として返すと、正常に表示されます。私のセルには、IBで指定された識別子があります。

セルオブジェクトを複数の行で再利用できないということですか?

4

2 に答える 2

1

ビューに表示されているボタンごとにUIButtonのインスタンスが1つ必要になるのと同じように、表示されている行ごとにセルのインスタンスが1つ必要になります。

これを管理するための一般的なパターンは、テーブルビューに、以前にインスタンス化された不要になったセル(dequeueReusableCellWithIdentifier:)を要求してから、そのセルを返すことです。テーブルビューに再利用可能なセルがない場合は、nibファイルから新しいセルをインスタンス化する必要があります。

ウェブ上にはこれに関する多くの例があります、そしてあなたはまたここSOでいくつかを見つけることができます、例えばこの答えで。

Apples TableViewプログラミングガイドを読むことをお勧めします。このガイドには、ペン先からのセルのロードに関するセクションも含まれています。

更新:TableViewとセルの再利用を別の方法で説明する試み。

古い絵画のある大きなギャラリーがあるとしましょう。何千もの絵画。ただし、ギャラリーには展示室が1つだけあり、壁には10枚の絵画しかありません。ギャラリーマネージャーは、訪問者が退屈して新しい絵画を見たいと思ったときに、時々絵画を切り替える必要があります。

表示されるすべての絵画にはフレームが必要です。フレームがないと壁に貼れません。フレームは作るのに費用がかかり、多くのスペースを占有します。フレームメーカーの人は、必要な数千のフレームを構築するための時間もお金も必要としません。

彼は、現在表示されていないすべての絵画のフレームが必要であることに気付きました。彼は現在表示されている絵画のために10フレームしか必要としません。ギャラリーマネージャーが絵を降ろすと、フレームメーカーがフレームを保存し、ギャラリーマネージャーが新しい絵を置いてフレームメーカーにフレームを要求すると、フレームメーカーは前の絵のフレームを再び返します。

ある日、絵画の間の必要なスペースの規制は、正当な理由もなく変更されます。ギャラリーマネージャーは、展示室にさらに2枚の写真を置くことができます。彼は物置から2枚の絵を選び、額縁メーカーに額縁を依頼します。フレームメーカーには予備のフレームがなく、2つの新しいフレームを作成する必要があります。

ここで、ギャラリーがTableViewであり、すべての絵画がデータの行であるとしましょう。目に見える10枚の絵画のためのスペースがある展示室は、10列の目に見える列のためのスペースがあるスクリーンです。表示されている各絵にフレームが必要なのと同じように、表示されている各行にはセルが必要です。

結局、1つのセルを再利用してリソースを節約することについてはそれほど気にする必要はありません。それがTableViewsの責任です。これは、TableViewの実装の詳細であり、必要なセルの数とその使用方法です。プロトコルは、TableViewに再利用可能なセルを要求する方法を定義し、ドキュメントには、再利用する必要があると記載されています。それで十分なはずです。デモプロジェクトは、TableViewが非常に大量のデータを管理できることを示しています。nibから10〜20個のセルをインスタンス化するためにプロジェクトでパフォーマンスが低下する場合は、nibファイルなどで問題が発生している可能性があります。ただし、 nibからのロードとコードでのセルの構築のパフォーマンスについてはいくつかの議論があります。それはあなたにとって興味深いかもしれません。

于 2010-07-16T06:21:56.750 に答える
0

私はあなたが少し前に説明しているものと非常によく似ているいくつかの非常に奇妙な行動をしました。

最終的に、問題は、親テーブルビューやコントローラーなどの他のアイテムを含むxibにテーブルビューセルを追加したばかりであることがわかりました。私がしなければならなかったのは、テーブルビューセルごとに個別のxibを作成することでした。問題は、正しく構築されていないxibからテーブルビューセルをロードすると、問題が混乱することだったと思います。

Vegarが言ったように、それを行う方法についてはたくさんのチュートリアルがあります。

于 2010-07-16T06:29:57.010 に答える