1

画面全体(480px)をカバーするUITableViewがあります。

各セルの高さは 300px です。

合計5行あります。

以下は私が使用したコードです。

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];
    if (cell==nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MainCell"];
    }

    UIButton *myButton = (UIButton *)[cell viewWithTag:999999999];
    int i = indexPath.row+1;
    myButton.tag = i;
    myButton.titleLabel.text = [NSString stringWithFormat:@"B - %d", i];
    [myButton setTitle:[NSString stringWithFormat:@"B - %d", i] forState:UIControlStateNormal];
    NSLog(@"tag set is %d & text for button is =====B-%d====", i,i);
    [myButton addTarget:self action:@selector(btnSelected:) forControlEvents:UIControlEventTouchUpInside];

    return cell;
}

- (int) tableView:(UITableView *) tableView numberOfRowsInSection:(NSInteger)section {
    return 5;
}


-(IBAction)btnSelected:(id)sender {
    UIButton *button = (UIButton *)sender;
    NSLog(@"my tag after click is ===%d", [button tag]);
}

このコードを実行すると、各セルB - 1B - 5書き込む必要があると予想されました。しかし、 の後B - 3、私が見るのはB - 1とだけB- 2です。

NSLogは以下のように言います。

2013-07-28 23:31:34.281 NewTest[1783:11303] tag set is 1 & text for button is =====B-1====
2013-07-28 23:31:34.284 NewTest[1783:11303] tag set is 2 & text for button is =====B-2====

完全に下にスクロールすると、次のように NSLog が表示されます。

2013-07-28 23:31:34.281 NewTest[1783:11303] tag set is 1 & text for button is =====B-1====
2013-07-28 23:31:34.284 NewTest[1783:11303] tag set is 2 & text for button is =====B-2====
2013-07-28 23:32:03.643 NewTest[1783:11303] tag set is 3 & text for button is =====B-3====
2013-07-28 23:32:03.719 NewTest[1783:11303] tag set is 4 & text for button is =====B-4====
2013-07-28 23:32:03.835 NewTest[1783:11303] tag set is 5 & text for button is =====B-5====

タグとテキストが適切に設定されている場合、最後の 2 つのボタンが B-4 と B-5 ではなく B-1 と B-2 として表示されるのはなぜですか。

この問題を解決する方法はありますか?

スクリーンショット 1

ここに画像の説明を入力

スクリーンショット 2

ここに画像の説明を入力

スクリーンショット 3

ここに画像の説明を入力


この問題を解決して B-1 から B-5 を書く方法はありますか?


注 : セルの高さを 100 に減らすと、すべてのボタン テキストが B-1 から B-5 として表示されます。

この質問は私の古い質問に関連していますが、これはより単純なバージョンです。

サンプルプロジェクト


私がしたことは、タグを使用せず、accessibilityValue を使用して、クリックされたボタンの ID を取得していることです。

4

1 に答える 1

3

下にスクロールすると、追加のセルを表示する必要があるため、テーブル ビューは表示されなくなったセルを再利用します。これが最初に発生するのはセル「B-3」です。テーブル ビューはセルを再利用しているtagため、セル内のボタンの は、コードによって既に何らかの数値 (おそらく 1) に設定されています。したがって、viewWithTag:999999999が返されnilます。あなたの NSLog ステートメントは、物事が正しく機能しているように見えますが、実際にはボタンにタイトルを設定しようとしているnilため、再利用されたセルのボタンは正しいタイトルで更新されません。

解決策として、次のプロパティを使用して UITableViewCell のカスタム サブクラスを作成できます。

@property (nonatomic, weak) IBOutlet UIButton *button;

そして、ストーリーボードまたはxibで、これをボタンまで配線します。awakeFromNibまたは、必要に応じて、セルのメソッドまたは init メソッドでプログラムでこれを行うことができます。cell.buttonを使用する代わりに、直接参照できるようになり[cell viewWithTag:9999999]ました。

于 2013-07-28T20:42:49.023 に答える