2015-04-11 5 views
0

Редактировать: Добавлен оператор else, чтобы удалить галочку. Однако теперь он больше не повторяет галочки, но если отмечены две или более ячейки, и я прокручиваю вниз и создаю резервную копию, он удаляет все из них, кроме одного. Любые идеи почему? У меня с трудом понимается переработка ячеек, когда это происходит.Контрольная метка на TableView повторяется при прокрутке

Я вытаскиваю свои волосы из этой проблемы, так как я просто не могу понять это. Любые указатели или помощь будут с благодарностью оценены.

Каждый раз, когда я выбираю ячейку и прокручиваю ее, она случайным образом повторяет галочку. Я решаю, нужна ли ячейке флажок, проверив indexPath.row с массивом, который содержит indexPath.row + 1.

Обновление названий и описаний при прокрутке работает просто отлично, это всего лишь флажки, которые действуют вверх.

Это мой текущий код cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *simpleTableIdentifier = @"KnuterItem"; 
    if([s.taskArray valueForKey:@"TaskData"] != [NSNull null]) 
    { 
     KJBasicCell *cell = (KJBasicCell*)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; 

     // Add utility buttons 
     NSMutableArray *rightUtilityButtons = [NSMutableArray new]; 

     [rightUtilityButtons sw_addUtilityButtonWithColor: 
     [UIColor colorWithRed:1.0f green:0.231f blue:0.188 alpha:1.0f] 
                title:@"Les mer"]; 

     cell.rightUtilityButtons = rightUtilityButtons; 
     cell.delegate = self; 

     if (cell == nil) { 

      NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"KnuterItem" owner:self options:nil]; 
      cell = [nib objectAtIndex:0]; 
     } 

     NSDictionary *item = [s.taskArray objectAtIndex:indexPath.row]; 

     if([item objectForKey:@"Title"] != [NSNull null]) 
      cell.titleLabel.text = [item objectForKey:@"Title"]; 
       if(s.textColor) 
        cell.titleLabel.textColor = s.textColor; 

     if([item objectForKey:@"Description"] != [NSNull null]){ 
      if (s.isNotAutoRowHeight == 0) { 
       cell.descLabel.numberOfLines = 0; 
      } else { 
       cell.descLabel.numberOfLines = 1; 
      } 
      cell.descLabel.text = [item objectForKey:@"Description"]; 
       if(s.textColor) 
        cell.descLabel.textColor = s.textColor; 
      cell.descriptionText = [item objectForKey:@"Description"]; 
     } 

     if([[s.selfArray valueForKey:@"CheckStat"] isEqualToString:@"(null)"]) 
     { 
      cell.accessoryType = UITableViewCellAccessoryNone; 
     } 
     else if([[s.selfArray valueForKey:@"CheckStat"] length] == 0) 
     { 
      if ([[item objectForKey:@"CheckStat"] containsString:@"1"]) 
       cell.accessoryType = UITableViewCellAccessoryCheckmark; 
      else 
       cell.accessoryType = UITableViewCellAccessoryNone; 
     } 
     else 
     { 
      NSLog(@"array: %@", [s.selfArray valueForKey:@"CheckStat"]); 
      for(int i = 0; i < [[[s.selfArray valueForKey:@"CheckStat"] componentsSeparatedByString:@","] count]; i++) 
      { 
       NSString *checkedNumStr = [[[s.selfArray valueForKey:@"CheckStat"] componentsSeparatedByString:@","] objectAtIndex:i]; 
       if ([checkedNumStr intValue] == indexPath.row + 1) 
         cell.accessoryType = UITableViewCellAccessoryCheckmark; 
       else 
        cell.accessoryType = UITableViewCellAccessoryNone; 
      } 
     } 


     return cell; 
    } 
    else 
     return nil; 
} 

didSelectRowAtIndex:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    if(cell.accessoryType == UITableViewCellAccessoryCheckmark) 
    { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 
    else 
    { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    CheckStatStr = nil; 
    for(int i = 0; i < [s.taskArray count]; i++) 
    { 
     NSIndexPath *eachPath = [NSIndexPath indexPathForRow:i inSection:0] ; 
     UITableViewCell *eachCell = [tableView cellForRowAtIndexPath:eachPath]; 
     if(eachCell.accessoryType == UITableViewCellAccessoryCheckmark) 
     { 
      if([CheckStatStr length] == 0 || !CheckStatStr) 
      { 
       CheckStatStr = [[NSMutableString alloc] init]; 
       [CheckStatStr setString:(NSString*)[NSString stringWithFormat:@"%d",i+1]]; 
      } 
      else 
       [CheckStatStr appendString:[NSString stringWithFormat:@",%d",i+1]]; 
     } 
    } 
    if(CheckStatStr){ 
     s.OldCheckStatStr = [s.selfArray valueForKey:@"CheckStat"]; 
     [s.selfArray setValue:CheckStatStr forKey:@"CheckStat"]; 
    }else{ 
     [s.selfArray setValue:@"0" forKey:@"CheckStat"]; 
    } 
} 
+0

Можете ли вы поделиться пример источника данных? – Asaf

+0

Источник данных - это NSMutableArray, который заполняется json, так как я запрашиваю его из базы данных MySQL. В массиве хранится информация как таковая: CheckStat = 1,5,8,9,15; – Chue

+0

http://stackoverflow.com/a/17540129/2099097 –

ответ

2

При проверке if ([checkedNumStr intValue] == indexPath.row + 1) и установите добавить метку, вам необходимо установить cell.accessoryType = UITableViewCellAccessoryNone, если это не так.

if ([checkedNumStr intValue] == indexPath.row + 1) 
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
else 
    cell.accessoryType = UITableViewCellAccessoryNone; 

вид ячеек таблицы не используются повторно, так что, если клетка, которая имеет метку повторно используется для строки, которые вы не хотите иметь отметку, что нужно, чтобы снять флажок.

+0

Это хороший пример кода +1 :-) – Schemetrical

+0

@dan Привет, и спасибо за ваш ответ Dan.Когда я добавляю оператор else, чтобы удалить галочку, он перепутался при прокрутке резервной копии, удалив галочку, которая должна быть там. Любая идея, почему это может произойти? – Chue

0

Не глядя на источник, я могу сказать, что вы являетесь жертвой рециркуляции ячеек. Apple делает это по соображениям производительности, убедитесь, что вы отменили выбор ячейки в tableView:cellForRowAtIndexPath: (удалите галочку), если ее не следует проверять, иначе она сохранит галочку при повторной утилизации другой ячейки.
cell.accessoryType = UITableViewCellAccessoryNone

Редактировать с большим количеством коды:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    if(cell.accessoryType == UITableViewCellAccessoryCheckmark) 
    { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 
    else 
    { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    s.taskArray[indexPath.row][@"CheckStat"] = @YES 
} 
+0

У меня теперь есть инструкция по удалению галочки, но если у нескольких ячеек есть галочка и я прокручиваю вниз и создаю резервную копию, все они не сохраняют галочку. Любая идея, почему это может произойти? – Chue

+0

@Chue Вам нужно сохранить галочку в своем локальном хранилище, поэтому установите 's.taskArray [indexPath.row] [@" CheckStat "] = @ YES' в' -tableView: didSelectRowAtIndexPath: ':-) – Schemetrical

+0

Это didn ' похоже, помогает. Возможно, это имеет какое-то отношение к тому, как я сохраняю свои текущие галочки. Допустим, у меня есть камера 1 - 12 на экране, и я проверяю их все. Он корректно сохраняет галочки, но если я прокручиваю вниз и выбираю из ячейки 6 - 18, то 1 - 6 удаляется из моего CheckStatStr, когда я пытаюсь добавить новые, и добавляются только видимые ячейки. Я редактировал мой текущий файл didSelectRowAtIndexPath. У вас есть идея о том, как я могу справиться с этим? – Chue

0

Другой причиной этого является то, если есть какие-либо слой при поддержке эффектов (например, анимация) ... Нажмите на самой CB и попы открыть «Просмотр эффекты инспектора «.. Там вы должны увидеть список слоев CA (основной анимации).

Если вы играли с рендерингом CB, тогда я предлагаю вам либо заглянуть туда, либо включить правильные слои , или повторно подключить плохо визуализированное исполнение: D

0

С Swift 3.0

cell.accessoryType = UITableViewCellAccessoryNone;

становится

`cell.accessoryType = UITableViewCellAccessoryType.none