2014-10-06 4 views
2

Так что я не уверен, как написать простой заголовок, который объясняет мою проблему.iOS: UITableView изменяет состояние выбора при прокрутке

У меня есть UITableView на моем экране. Пока вид таблицы меньше экрана (все ячейки подходят на экране без прокрутки), все в порядке. Однако, как только пользователь должен прокрутить экран, чтобы найти ячейку, которая находится в нижней части таблицы, некоторые ячейки случайным образом меняют свое состояние выбора. я реализовал UITableView так:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *simpleTableIdentifier = @""; 

    switch (indexPath.section) 
    { 
     case 1: 
     { 
      if (indexPath.row == 0) 
      { 
       simpleTableIdentifier = @"EventDateCell"; 
      } 
      else 
      { 
       simpleTableIdentifier = @"EventDateSelectCell"; 
      } 

      [...] 

      return cell; 
     }break; 

     case 2: 
     { 
      simpleTableIdentifier = @"SelectPlayerCell"; 

      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

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

      Player *player = [self.playerController getPlayerAtPosition:indexPath.row]; 

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

      return cell; 
     }break; 

     default: 
     { 
      simpleTableIdentifier = @"EventNameCell"; 

      [...] 

      return cell; 
     }break; 
    } 
} 

ли Xcode изменить indexPath.row в соответствии с клетками, которые показаны на экране?

Код для обозначения выбранной ячейки:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(indexPath.section == 1 && indexPath.row == 0) 
    { 
     [..] 
    } 
    else if (indexPath.section == 2) 
    { 
     // close date picker if it is still open 
     if (self.selectingEventDate == TRUE) 
     { 
      [...] 
     } 

     if(self.createdEvent != nil) 
     { 
      if ([[tableView cellForRowAtIndexPath:indexPath] accessoryType] == UITableViewCellAccessoryCheckmark) 
      { 
       [self tableView:tableView didDeselectRowAtIndexPath:indexPath]; 
      } 
      else 
      { 
       [[tableView cellForRowAtIndexPath:indexPath] setSelected:TRUE]; 
       [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType: UITableViewCellAccessoryCheckmark]; 

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

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(indexPath.section == 1 && indexPath.row == 0) 
    { 
     [...] 
    } 
    else if (indexPath.section == 2) 
    { 
     if(self.createdEvent != nil) 
     { 
      [[tableView cellForRowAtIndexPath:indexPath] setSelected:FALSE]; 
      [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType: UITableViewCellAccessoryNone]; 

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

я узнал: Если первая ячейка помечается, есть 12 ячеек, которые отображаются правильно, а 13 проверяется.

+0

Проверьте мой ответ это работает в моем проекте –

ответ

2

Только изменить внешний вид ячейки в cellForRowAtIndexPath:. Если вы внесете изменения в другом месте, они будут применены к кэшированным ячейкам, которые будут возвращены вам dequeueReusableCellWithIdentifier:.

В этом случае дать игроку «выбранный» атрибут, установить его, когда вам нужно, и вызвать reloadData. В cellForRowAtIndexPath: этот атрибут используется для установки состояния выбора ячейки.

+0

не будет ли это замедлять программу? – Pascal

+0

Не в какой-либо заметной манере. Перезагрузка влияет только на видимые ячейки, поэтому вы смотрите только на обновление 12 ячеек. –

+0

(И поскольку вы используете объект игрока для предоставления данных ячейки для других целей, лучше хранить информацию там, чем манипулировать несколькими массивами.) –

5

Прежде всего, вы берете массив, который сохраняет значение при выборе ячейки и удаляет значение при щелчке по второму времени ячейки.

В ViewController.h файле

@property (неатомической, сохранить) NSMutableArray * arySelectionState;

В ViewController.m файл

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    arySelectionState = [[NSMutableArray alloc]init]; 
} 

ргадта знак - TableView делегат

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

    custom_Cell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellDetails" forIndexPath:indexPath]; 


    if ([arySelectionState containsObject:[NSNumber numberWithLong:indexPath.row]]) 
    { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 

    } 
    else 
    { 
     cell.accessoryType = UITableViewCellAccessoryNone; 

    } 



    [cell.labtest setText:[NSString stringWithFormat:@"Lable_%ld",(long)indexPath.row]]; 

    // Configure the cell... 

    return cell; 
} 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    if ([arySelectionState containsObject:[NSNumber numberWithLong:indexPath.row]]) 
    { 

     [arySelectionState removeObject:[NSNumber numberWithLong:indexPath.row]]; 

     [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType: UITableViewCellAccessoryNone]; 
    } 
    else 
    { 

     [arySelectionState addObject:[NSNumber numberWithLong:indexPath.row]]; 

     [[tableView cellForRowAtIndexPath:indexPath] setAccessoryType: UITableViewCellAccessoryCheckmark]; 
    } 


} 

ЕГО РАБОТА FINE ......

Смежные вопросы