UITableView可选列表

时间:2014-07-24 05:48:01

标签: ios objective-c uitableview selection

我正在尝试实现可选择的列表视图。列表视图包含一些名称。您可以选择或取消选择多个名称。如果选择了名称,则单元格样式将更改为UITableViewCellAccessoryCheckmark

但现在我遇到了问题。在取消选择名称之前,您必须多次按下该单元格。这是因为didSelectRowAtIndexPath始终首先被调用。

// cellForRowAtIndexPath function
    if ([assignedPlayers containsObject:player.persistentData])
    {
        [cell setSelected:true];
        [cell setAccessoryType: UITableViewCellAccessoryCheckmark];
    }

    cell.textLabel.text = [NSString stringWithFormat:@"%@", player.persistentData.name];

    return cell;
}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [[tableView cellForRowAtIndexPath:indexPath] setSelected:FALSE];
    [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType: UITableViewCellAccessoryNone];

    [self.eventController removePlayerFromEvent:_editingEvent :[self.playerController getPlayerAtPosition:indexPath.row]];
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [[tableView cellForRowAtIndexPath:indexPath] setSelected:TRUE];
    [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType: UITableViewCellAccessoryCheckmark];

    [self.eventController addPlayerToEvent:_editingEvent :[self.playerController getPlayerAtPosition:indexPath.row]];
}

现在我不知道如何解决这个问题。

感谢您的帮助。

5 个答案:

答案 0 :(得分:1)

请看下面的示例,其中_selectedList包含所选的播放器,_datasoureArray是包含所有播放器名称的数据源。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL"];
  if(cell == nil)
   {
      cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"];
   }
   cell.textLabel.text = [_datasoureArray objectAtIndex:indexPath.row];
   if([_selectedList containsObject:[_datasoureArray objectAtIndex:indexPath.row]]) //hear selected list is an mutable array wich holds only selected player
    {
      cell.selected = YES;
      cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
    else
    {
      cell.selected = NO;
      cell.accessoryType = UITableViewCellAccessoryNone;
    }
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
   if(cell)
   {
      if(cell.accessoryType == UITableViewCellAccessoryNone)
      {
        [_selectedList addObject:[_datasoureArray objectAtIndex:indexPath.row]];//add
      }
      else
      {
        if([_selectedList containsObject:[_datasoureArray objectAtIndex:indexPath.row]])
       {
           [_selectedList removeObject:[_datasoureArray objectAtIndex:indexPath.row]]; //remove
       }
     }
 }
 [tableView reloadData];
 NSLog(@"%@",_selectedList.description);
}

答案 1 :(得分:0)

您需要使tableView支持多个选择。请在viewDidLoad中尝试以下代码:

self.myTableView.allowsMultipleSelection = YES;

然后你不会在各自的代表中需要这两行:

[[tableView cellForRowAtIndexPath:indexPath] setSelected:TRUE];

[[tableView cellForRowAtIndexPath:indexPath] setSelected:FALSE];

答案 2 :(得分:0)

维护检查每个选定的索引,例如:使用选择索引

每次选择一个单元格时都不会将其添加到此数组中,例如:

  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if ([selectedIndex containsObject:indexPath]) {

            [selectedIndexes removeObject:indexPath];

        }else{

            [selectedIndexes addObject:indexPath];
       }

       [tableView reloadData];
    }

然后在CellForROwAtIndex

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
            if ([selectedIndex containsObject:indexPath]) {
 [cell setSelected:TRUE];
    [cell setAccessoryType: UITableViewCellAccessoryCheckmark];

    [self.eventController addPlayerToEvent:_editingEvent :[self.playerController getPlayerAtPosition:indexPath.row]];
}

}else{
 [cell setSelected:FALSE];
    [cell setAccessoryType: UITableViewCellAccessoryNone];

    [self.eventController removePlayerFromEvent:_editingEvent :[self.playerController getPlayerAtPosition:indexPath.row]];


}


}

这样会更有效,而不是从DidSelect方法中获取Cell,只需确保使用[tableView reloadData];在didSelectRowAtIndexPath

答案 3 :(得分:0)

如果不是containsObject,则应将accessoryType设置为UITableViewCellAccessoryNone。 因为细胞可以重复使用。 并且您在选择或分析时不需要设置选定的内容。

if ([assignedPlayers containsObject:player.persistentData]){
    [cell setAccessoryType: UITableViewCellAccessoryCheckmark];
} else {
    cell.accessoryType= UITableViewCellAccessoryNone;
}

答案 4 :(得分:0)

您可以通过以下方式实现功能, 当您选择一行时,您将检查您的数组中是否有与该行对应的人,如果它已经将其从数组中删除,则将其添加到数组并重新加载您的表。并且在cellForRowAtIndexPath方法中检查数组是否存在,如果存在,则设置为true,否则设置为选择false。

// cellForRowAtIndexPath函数

{
    if ([assignedPlayers containsObject:player.persistentData])
    {
    [cell setSelected:true];
    [cell setAccessoryType: UITableViewCellAccessoryCheckmark];
    }
    else 
    {
    [cell setSelected:Flase];
    [cell setAccessoryType: UITableViewCellAccessoryCheckmarkNone];
    }
    cell.textLabel.text = [NSString stringWithFormat:@"%@", player.persistentData.name];
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([assignedPlayers containsObject:player.persistentData])
    {
    [assignedPlayers removeObject:player.persistentData];
    }
    else
    {
    [assignedPlayers addObject:player.persistentData];
    }
    [tableView reloadData];
}