1

ユーザーがツールバーのボタンを押すと、編集モードに切り替わる UITableViewController があります。ユーザーに複数のセルを選択してもらい、選択した各セルの左側に丸い赤いチェックマークを付けてもらいます。ストーリーボードのテーブル ビューで [編集中に複数選択]を選択しましたが、カスタム セルのアクセサリ/編集アクセサリはありません。

問題は、tableView のindexPathsForSelectedRowsでタップされた各セルを見つけることができますが、選択された各セルの左側にある赤いチェックマークが表示されないことです。ただし、編集モードを終了すると、選択した各セルの右側にチェックマーク アクセサリが表示されます (編集が終了したら、もう必要ありません)。

編集中: 編集 ここに画像の説明を入力 後: ここに画像の説明を入力

コードで行ったことは次のとおりです。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   if (tableView.editing)
   {
       UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];
       if ([selectedCell accessoryType] == UITableViewCellAccessoryNone)
       {
           [selectedCell setAccessoryType:UITableViewCellAccessoryCheckmark];
       }
       else
       {
           [selectedCell setAccessoryType:UITableViewCellAccessoryNone];
       }
   }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  ...
  if (tableView.editing)
  {
      cell.accessoryType = UITableViewCellAccessoryNone;
      for (NSIndexPath *selectedIndex in [self.tableView indexPathsForSelectedRows])
      {
          if ([selectedIndex isEqual:indexPath])
          {
             cell.accessoryType = UITableViewCellAccessoryCheckmark;
             break;
          }
      }
  }
  ...

ありがとう!

4

2 に答える 2

1

誰かが同じ問題に遭遇した場合、ここに私がどのように解決したかを抜粋します。UITableView の編集モードを切り替える IBAction に接続されたツールバー ボタンがあります。編集が有効になっている場合、ユーザーは行を選択し、選択した行数がラベルに設定されている削除ボタンを押すことができます。

@interface TableViewController ()
{
    NSMutableArray      *selectedCellRows;      // Used to remember which cells have been selected during editing mode
}

- (IBAction)toggleEditing:(id)sender;

@end


@implementation TableViewController

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    GeneralReservationCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CELL_IDENTIFIER];

    // Set up the cell...
    [self configureCell:cell forTableView:tableView atIndexPath:indexPath];

    return cell;
}

- (void)configureCell:(GeneralReservationCell *)cell forTableView:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath
{
    // Basic layout
    cell.nameLabel.text = @"Some text";

    cell.selected = NO;
    if (tableView.editing)
    {
        for (NSIndexPath *selectedIndex in selectedCellRows)
        {
            if ([selectedIndex isEqual:indexPath])
            {
                cell.selected = YES;
                break;
            }
        }
    }
}


#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (self.tableView.editing)
    {
        [selectedCellRows addObject:indexPath];
        [self updateEditingToolbarButton];
    }
    else
    {
        // Do whatever you do normally when the cell gets selected
    }
}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (self.tableView.editing)
    {
        [selectedCellRows removeObject:indexPath];
        [self updateEditingToolbarButton];
    }
}


- (void)updateEditingToolbarButton
{
    int selectedRows = [self.tableView.indexPathsForSelectedRows count];

    if (selectedRows == 0)
    {
        [deleteBarButton setTitle:@"delete"];
        deleteBarButton.enabled = NO;
    }
    else
    {
        [deleteBarButton setTitle:[NSString stringWithFormat:@"delete (%d)", selectedRows]];
        deleteBarButton.enabled = YES;
    }
}


#pragma mark - IBActions

- (IBAction)toggleEditing:(id)sender
{
    if(self.tableView.editing)
    {
        [self.tableView setEditing:NO animated:YES];
        [selectedCellRows removeAllObjects];
        [self showToolbarInEditingMode:NO];
    }
    else
    {
        [self.tableView setEditing:YES animated:YES];
        [self showToolbarInEditingMode:YES];
    }
}


@end

さらに、Interface Builder で編集アクセサリをに設定しました。none

于 2013-09-14T12:35:16.697 に答える