1

私は、コンピューターを窓から放り投げるほどの重大な問題に直面しています。アクションのトリガーに問題はありませんが、テーブルを下にスクロールして最初のセルに戻ると、他のセルにボタンが作成されます。つまり、セル 1 と 3 にボタンがあると想定されている場合、テーブルビューが作成されると、それらだけがボタンを持ちます。上下にスクロールすると、セル 2、3、4 にもボタンがあります (特定のルールはありません)。ボタンも完全に機能していますが、そこにあるはずはありません!

static NSString *CellIdentifier = @"Cell";
    OpinionCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell= [[OpinionCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

...いくつかの影響力のあるコード.......

if(([[aComment objectForKey:@"TypeMsg"] intValue]==310)&&([[parentMessage objectForKey:@"TypeMsg"] intValue]==310)){
            UIButton *_openReplyButton = [[UIButton alloc] initWithFrame:CGRectMake(280, 5, 20, 20)];
            [_openReplyButton setImage:[UIImage imageNamed:@"reply_button.png"] forState:UIControlStateNormal];
            [_openReplyButton addTarget:self action:@selector(addRowsForShowReply:) forControlEvents:UIControlEventTouchUpInside];
            [cell addSubview:_openReplyButton];
            NSLog(@"%@", [aComment objectForKey:@"Message"]);
        }

ご助力ありがとうございます!

4

2 に答える 2

1

これは の古典的な問題ですUITableView。テーブルビューが行うデキューと再利用のプロセスを理解するのに何年もかかりました。これを修正する必要があります。

ボタンを初期化するコードを、 かどうかをチェックする部分に移動しますcell == nil。これは、デキューされたばかりのセルにサブビューを追加することは想定されていないためです。そのセルにサブビューが既に追加されているかどうかがわからないためです。また、ボタンにタグを設定するか、 のプロパティにする必要がありますOpinionCell。そうすれば、後でアクセスできます。

次に、ボタンを表示する必要があると判断した場合は、cell.replyButton.hidden = NOまたはを設定し[cell viewWithTag:kMyButtonTag].hidden = NOます。非常に重要なelseことですが、句で非表示に設定する必要があります。それ以外の場合、ボタンは一見ランダムなセルに表示されます。

お役に立てれば!

于 2013-06-28T20:54:12.820 に答える
0

次のコードを使用して、セルがデキューまたは初期化された直後に UITableViewCell からサブビューを削除できます。これにより、すべてのサブビューが削除されるか、dado728 が前述した内容に従うことができます。

[[セル サブビュー] performSelectorOnMainThread:@selector(removeFromSuperview) withObject:nil waitUntilDone:NO];

于 2013-06-28T21:23:19.677 に答える