0

カスタムボタンをに追加していますがcell.contentView、セルが画面の表示部分からスクロールされて元に戻るたびに、ボタンが再度追加されることに気付きました。ボタンの半透明の部分がどんどんしっかりしています。tableViewをスクロールするときに、より多くのオブジェクトを上にスタックし続けないように処理する正しい方法は何ですか?if (cell == nil) {...}カスタムコンテンツはセルごとに異なるため、ブロックに入れることはできません。

私が持っているコードは次のとおりです。

UISegmentedControl *btn = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:btn_title]];
// set various other properties of btn
...
[cell.contentView addSubview:btn];
4

2 に答える 2

3

セルがデキューされるたびに、新しいサブビューを追加する前に古いサブビューを削除する必要があります。そうしないと、そのスタック効果が得られます。これは、次の2つの場所のいずれかで実行できます。

a)で、呼び出し後、新しいビューを追加する前にtableView:cellForRowAtIndexPath:、古いビューを削除します。dequeueReusableCellWithIdentifier:

b)のサブクラスを使用している場合はUITableViewCell、オーバーライドprepareForReuseして不要なビューを削除できます。 prepareForReuseセルが再利用のためにデキューされるたびに呼び出されるため、セルが最後に構成されたときの古いビューを削除するのに適した場所です。

于 2012-11-29T21:55:10.917 に答える
0

投稿したコードの修正例を投稿します。より多くのビューを処理するように拡張できます。

手順は次のとおりです。

  1. セットアップ全体を処理するメソッドをCustomCellクラスに作成します(例setupWithItems::)
  2. セルが入ったらcellForRowAtIndexPath:(セルをデキューまたは作成した後)、setupWithItems:セルに表示されるアイテムの新しいリストを使用して呼び出す必要があります。
  3. setupWithItems:実装では、UISegmentedControlを親ビューから削除してください。セグメント化されたコントロールがカスタムセルのプロパティとして保存されている場合は、これを簡単に行うことができます。
  4. setupWithItems:実装では、新しいUISegmentedControlを作成し、それをCustomCellのビュー階層に追加します。

サンプルコード:

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    CustomCell* cell = [tableView dequeueReusableCellWithIdentifier:kSomeIdentifier];

    if (!cell)
    {
        // Create a new cell
    }

    NSArray* currentCellItems = [self cellItemsForRow:indexPath.row];

    [cell setupWithItems:currentCellItems];

    return cell;
}

そして、CustomCellサブクラスでは:

- (void)setupWithItems:(NSArray*)items
{
    if (self.segmentedControl)
    {
        [self.segmentedControl removeFromSuperView];
        self.segmentedControl = nil;
    }

    // More setup...

    UISegmentedControl *btn = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObject:btn_title]];
    // set various other properties of btn

    [cell.contentView addSubview:btn];
}
于 2012-11-29T22:08:13.190 に答える