1

cellViewsがパージされないことに気付きました。つまり、上下にスクロールすると、再利用されたばかりのcellViewにサブビューが追加され続けます...何が間違っているのでしょうか。

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString* cellIdentifier=@"cell";

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if(cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
    }

    UIImageView cellView = [[UIImageView alloc] initWithFrame:rectCellFrame];

    NSError* error=nil;
    NSData* imageData = [NSData dataWithContentsOfURL:imageArray[indexPath.row] options:NSDataReadingUncached error:&error];

    UIImage* theImage= [UIImage ImageWithData:imageData];

    [cellView setImage:theImage];

    [cell addSubView:cellView];

    .
    .
    .
    .

    [cell addSubView:moreViews];

}
4

4 に答える 4

1

セルの内容を大幅に変更する場合UITableViewCellは、基本クラスの代わりにサブクラスを作成して参照することをお勧めします。そうすれば、CFRAIPdrawRectでを変更する代わりに、サブクラスのメソッドで更新を行うことができます。UITableViewCell

prepareForReuseセルを再利用する前に、セルのメソッドを呼び出してプロパティをリセットすることもできることに注意してください。

于 2013-03-12T19:04:22.753 に答える
1

dequeueReusableCellWithIdentifier:が(nilではなく)セルを返す場合、それは以前にtableView:cellForRowAtIndexPath:メソッドで作成したセルです。最初にセルを作成したときにそのセルに追加したすべてのサブビューは、まだセル内にあります。からセルを取得するときにサブビューを追加すると、セルにdequeueReusableCellWithIdentifier:サブビューが追加されます。

メソッドのtableView:cellForRowAtIndexPath:基本構造は次のとおりです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *const kIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
            reuseIdentifier:kIdentifier];

        // code here to add subviews to cell.contentView
    }

    // code here to configure those subviews to display the content for indexPath, e.g.
    // set the image of image views and the text of labels.

    return cell;
}

トリッキーな部分は、セルがによって返されたときにサブビューにアクセスしてコンテンツを設定することdequeueReusableCellWithIdentifier:です。ビュータグを使用してサブビューにアクセスする方法について説明している、iOS用テーブルビュープログラミングガイドの「セルのコンテンツビューにサブビューをプログラムで追加する」を参照してください。

于 2013-03-12T19:05:40.417 に答える
1

各メソッド呼び出しでセルにサブビューを追加しています。これは、セルが再利用されるときに、すでに古いサブビューがあることを意味します。新しいものを追加する前に、それらを削除する必要があります。例えば[cell.contentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

于 2013-03-12T19:07:04.543 に答える
0

毎回- (UITableViewCell*)cellForRowAtIndexPath:(NSIndexPath *)indexPath呼び出され、これらをすでに追加しているセルに再度追加されcellViewます。 再利用可能なセルは、を呼び出したときにサブビューを削除しません。サブビューを追加する場合の最善の解決策は、サブクラス化して、サブクラス化されたメソッドにサブビューを追加することです。moreViewsUIView
dequeueReusableCellWithIdentifierUITableViewCellinitUITableViewCell

于 2013-03-12T19:01:11.953 に答える