0

次のような問題があります。

  • 私はテーブルビューを持っています。セル(または行)をクリックすると、セルにさらに2つのボタンが追加され、サイズが変更されます。
    • この機能は正常に動作します!
  • 問題は、最初の行をクリックしたときです。
    • 2つのボタンを作成し、サイズを変更します
    • 下にスクロールすると、別のセルにも2つのボタンが表示されます。
    • これは、ボタンを表示してセルのサイズを変更する機能の私のコードです
  • 下にスクロールすると、テーブルがリロードされ、indexPath がリセットされるため、2 つのセルの両方にボタンが表示されると思います。誰にも何か提案がありますか!?

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    tvcCategory *cell = (tvcCategory*)[tableView cellForRowAtIndexPath:indexPath];
    NSLog(@"- %i ", indexPath.item);
    if (selectedIndex.item != indexPath.item) {

        [btnEdit removeFromSuperview];
        [btnTransact removeFromSuperview];

        objSession.catId = cell.lblId.text;
        btnEdit = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        btnEdit.frame = CGRectMake(91, 72, 73, 35);
        [btnEdit setTitle:@"Edit" forState:UIControlStateNormal];
        [btnEdit setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [btnEdit setBackgroundImage:buttonImage forState:UIControlStateNormal];
        [btnEdit setBackgroundImage:buttonImageHighlight forState:UIControlStateHighlighted];
        [btnEdit addTarget:self action:@selector(moveToEditingScreen)  forControlEvents:UIControlEventTouchUpInside];

        btnTransact = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        btnTransact.frame = CGRectMake(176, 72, 95, 35);
        [btnTransact setTitle:@"Transact" forState:UIControlStateNormal];
        [btnTransact setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [btnTransact setBackgroundImage:buttonImage forState:UIControlStateNormal];
        [btnTransact setBackgroundImage:buttonImageHighlight forState:UIControlStateHighlighted];
        [btnTransact addTarget:self action:@selector(moveToTransactionScreen) forControlEvents:UIControlEventTouchUpInside];


        [tableView reloadData];
        [cell.contentView addSubview:btnEdit];
        [cell.contentView addSubview:btnTransact];
        lastClickedCell = cell;
        self.selectedIndex = indexPath;

        NSIndexPath* rowToReload = [NSIndexPath indexPathForRow:-1 inSection:0];
        NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil];
        [tableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationFade];
        [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;

    }
    else
    {
        [tableView reloadData];
        [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
    }
}

本当に感謝しております

4

1 に答える 1

0

みんながコメントで公開したように、あなたが直面している問題は、テーブルビューメソッドでは、パフォーマンスを最適化するためにセルを再利用する必要があるため、既に使用されているこのセルを取得して、期待どおりに調整する必要があることですセル状態。

おそらくcellForRowAtIndexPath、セルがないときに割り当てて調整するように注意しているだけです。調整する必要があります。常に初期状態に調整するか、ボタンが有効かどうかを確認するなど、いくつかのオプションがあります。この場合にのみ、セルを再設計します。

したがって、クラスでは、ある時点で次のメソッドがあります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if(cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    } else {
        if([selectedIndex isEqual:indexPath]){
           //Add your buttons and adjust the cell to show the extra buttons
        } else {
           if(your selected index isn't in the screen anymore){
               [btnEdit removeFromSuperview];
               [btnTransact removeFromSuperview];
           }
           //your others adjusts
        }

    }
}

編集:

[[yourTable indexPathsForVisibleRows] containsObject:selectedIndexPath];

このメソッドは、選択したインデックスがその中にあるかどうかを確認する必要がある配列を返します。UITableView の詳細については、ドキュメントを参照してください。

于 2013-05-24T22:11:46.427 に答える