2012-03-11 4 views
0

私はUITableViewを持っていますが、各セルは内容が一意ですが、目的のためには同じですが、セルの作り方は不明です。次の画像を参照してください。
Example Image
ブラックボックスのアウトラインは、行で区切られた表を表します。各行は可変の高さを有し、異なるデータの視覚的表現を含む。
私は約50行を持っています。各行には、2UIViewsとUILabelに存在する緑色/青色のラインのうちの約10個が含まれています。私は編集や削除の必要はありません。データは約±30kBのJSONです。これを強く型付けされたオブジェクトに変換します。UITableView内のすべてのセルが一意であるときに行うべきことは?


は、これまでのところ私は、次のアプローチを特定していない:

  1. ませデキューを、一度はデータをcorrespondendingだで構成各セルを保存します。
  2. デキューなし、セルを保存せず、データから完全に視覚的表現を初期化して再構成する。

    デキューは常に優れています。

  3. 一意の識別子を介して細胞をデキューし、そうでない場合は
    • それを構築するには、一意の識別子を使用してこれを行うことができますか私はそれを自分自身を実装する必要がありますか?
  4. セルをデキューし、データから完全に視覚的表現を再構成する。

スクロールするときにすぐに表の表示に表示されないようにしても問題ありません。ワーカースレッドでセルを構築し、各セルの構築時にセルの内容を追加しても問題ありません。

どのようなアプローチが最も適していて、受け入れられると思われますか?あるいは、別のアプローチがなぜ優れているのでしょうか?

+0

セルは、再利用されたtableviewで再構築されず、再利用可能なセルにそれらのデータを送信します。ただし、これらのデータはWebサービスから取得していますか?ワーカースレッドは、データのネットワークコールがデバイスに保存されるのを待たなければなりませんか? – doNotCheckMyBlog

+0

私の最大の問題の一つは、実際のデータでした。私の意見では、これは醜いJSONです:それぞれの緑色の線は、実際の行とは別の配列の別々の要素です。彼らはまた、完全に順序付けられていないので、すべてのデータが利用可能になるまで行の高さは不明です。私はWebサービスからデータをダウンロードしています。 – Xeago

答えて

3

行数が

  1. 非常に少ない行数(ワイズメモリフットプリント)

各行むしろ無関係に固定されている場合、クイックウェイ™はプリになりにすべてのセルを取り出し、必要に応じてそれらを返します。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return [myCells objectAtIndex:indexPath.row]; 
} 

ただし、slあなたのセルがすべて一度にメモリに収まるわけではない(すべてのバックグラウンドを覚えておいて合計22-25MBのヒープスペースを覚えている)ならば、やや冗長な方法を検討して、最初にアクセスされたときに結果をキャッシュします。良いニュースは、UITableViewが既にあなたのためにそれを正確に行い、意図したとおりにセル識別子を使用することです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    NSString *identifier = [NSString stringWithFormat:@"MyCell%d", indexPath.row]; 
    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 
    if (cell == nil) { 
     cell = [[MyTableViewCell alloc] initWithCellIdentifier:identifier]; 
     [cell autorelease]; // if non-ARC 
    } 
    return cell; 
} 

rocirが示唆しているように、nil識別子を使用しないことをおすすめします。セル識別子にnilを指定すると、UTTableViewControllerがセルをキャッシュするのを防ぐことができます(documentation)。これにより、セルが表示領域外にスクロールされ、ユーザーがスクロールバックした後の段階で再び表示されるときに、オーバーヘッドが増加します。この場合、セルはまだ周囲にあるかもしれませんが、tableView:cellForRowAtIndexPath:が呼び出されたときにアクセスする方法はありません。

+0

私はこのアプローチを行っています。私がパフォーマンスの問題に取り組んだ場合、私はセルの表面に直接描画するか、データソース内のセルのコントロールを保存するか(yuck)、セルの内容を非同期に構築します(たとえば、必要なビューを作成し、 setNeedsLayout];)私が成功した場合、または他の受け入れ可能な回答が提供されていない場合、回答としてマークされます。ありがとう – Xeago

1

時にはセルを再利用すると、それぞれがユニークであるときにいくつかの問題が発生することがあります。それは事件によって異なり、私はあなたがそれをどのように実装しているのかよく分かりません。パフォーマンスの問題を引き起こさずに何をしたかは、識別子にnilを渡して毎回セルを構築することです。

UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]; 

これは、セルの作成方法によってパフォーマンスの問題が発生する可能性があります。しかし、単純な目的のためには、うまくいくはずです。

+0

nilを一意の識別子より悪い識別子として使用していませんか?または、メモリにセルを保持することからtableviewを停止することはありませんか?ユニークなものを渡すと、時には正しいセルになる可能性があります。 アプローチ@rocirの言及は2番目になります。私は表示されているすべての行のテキストで水平の色付きの線を作成する必要があります。そのビュー 'EventView'を呼び出してみましょう。 EventViewの開始点と幅を知るには、2つの日付をビューのx座標を表す浮動小数点値に変換する必要があります。 別のスレッドでこれをキューに入れても問題ありません。 – Xeago

関連する問題