0

Marker型のプロパティを持つcustomTableViewCellがあります。このオブジェクトを使用して、たとえばUILabelなどのUI要素をバインドします。

TableSectionオブジェクトがあります。これは基本的に、物事をより適切に管理するためにグループ化されたテーブルに使用します。次のようになります。

@interface TableSection : NSObject

@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) NSMutableArray *array;

私のcellForAtIndexPathメソッドでは、次のようにします。

    TableSection *tableSection = [self.markersList objectAtIndex:indexPath.section];
    Marker *m = (Marker *)[tableSection.array objectAtIndex:row];
    cell.marker = m;

Webサービスから取得した情報にさらに情報がある場合は、このセルを更新したいと思います。

したがって、テーブルビューでオブジェクトのindexPathを取得し、次のことを試してみます。

- (void)updateIndexPath:(NSIndexPath *)indexPath marker:(Marker *)marker {
    MarkerTableViewCell *cell = (MarkerTableViewCell *)[self.MarkersTableView cellForRowAtIndexPath:indexPath];

tableViewの最初のセクションでは、cell.markerこれが期待どおりです。ただし、他のセクションでcell.markerはnilです。これには理由がありますか?ありがとう。

4

1 に答える 1

2

UITableView の仕組みは、現在表示されているセルのみが含まれていることです。したがって、アクセスしようとしているセルがビューにない場合は、何も得られません (または、セルが再利用されるため、ゴミになる可能性があります)。

この種の状況に対処する唯一の方法は、データ配列を使用することです。マーカーをセルに関連付ける代わりに、マーカーをデータ配列に関連付けます。次に、Webサービスが更新された情報を提供すると、配列でそのマーカーを見つけて、必要なものを更新します。そうすれば、セルが画面上にあるかどうかに関係なく、データ ソースが更新されます。オフスクリーンの場合、次にオンスクリーンになったときに、コードは cellForRowAtIndexPath を呼び出し、データ ソースは更新された情報をそれに渡します。

簡単に言うと、データ ソースはすべてのデータを見つけることができる唯一の場所であり、OS はメモリを節約するためにデータを解放しません。

于 2013-02-01T19:57:37.313 に答える