2013-05-14 5 views
1

Отработанные часы и часы и без использования. Я не понимаю, был ли я неэффективен при поиске (поиск в Интернете), или это то, что на этот вопрос меньше вопросов или Возможно, я ошибся при выполнении ответов экспертов!Установите одну галочку для каждого раздела в UITableView и сохраните ее состояние

Я знаю, что есть несколько вопросов по установке галочки типа аксессуаров для одной строки, а для других строк в разделе нет, для прочтения сообщений here и there.

У меня есть 2 раздела в моем представлении таблицы. По умолчанию я хочу, чтобы 1-я строка в каждой секции была выбрана, т. Е. С контрольной меткой аксессуаров. Теперь, после выбора пользователем строки, я хочу, чтобы галочка была видны на выбранной строке only.I попытались объявить два пути индекса для отслеживания выбора строк в каждой section.Here мой код реализации:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    NSString *cellIdentifier = [NSString stringWithFormat:@"S%1dR%1d",indexPath.row,indexPath.section]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (indexPath.section == 0) 
    { 
     if(self.firstSectionIndex == indexPath) 
     { 
      cell.accessoryType = UITableViewCellAccessoryNone; 
     } 
     else 
     { 
      cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     } 
    } 

    if (indexPath.section == 1) 
    { 
     if(self.secondSectionIndex == indexPath) 
     { 
      cell.accessoryType = UITableViewCellAccessoryNone; 
     } 
     else 
     { 
      cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     } 
    } 

    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; 
     cell.backgroundColor = [UIColor clearColor]; 
     cell.textLabel.textColor = [UIColor whiteColor]; 

     switch (indexPath.section) 
     { 
      case 0: 
      { 
       if (indexPath.row == 0) 
       { 
        if(self.firstSectionIndex != indexPath) 
        { 
         cell.accessoryType = UITableViewCellAccessoryCheckmark; 
        } 
        else 
        { 
         cell.accessoryType = UITableViewCellAccessoryNone; 
        } 
        cell.textLabel.text = @"Yes"; 
       } 
       if (indexPath.row == 1) 
       { 
        cell.textLabel.text = @"No"; 
       } 
      } 
       break; 
      case 1: 
      { 
       if (indexPath.row == 0) 
       { 
        if(self.secondSectionIndex != indexPath) 
        { 
         cell.accessoryType = UITableViewCellAccessoryCheckmark; 
        } 
        else 
        { 
         cell.accessoryType = UITableViewCellAccessoryNone; 
        } 
        cell.textLabel.text = @"Easy"; 
       } 
       if (indexPath.row == 1) 
       { 
        cell.textLabel.text = @"Medium"; 
       } 
       if (indexPath.row == 2) 
       { 
        cell.textLabel.text = @"Hard"; 
       } 
      } 
       break; 

      default: 
       break; 
     } 
    } 

    tableView.backgroundColor = [UIColor clearColor]; 
    tableView.backgroundView = nil; 

    return cell; 
} 

в моем didSelectRowAtIndexPath, я сделал следующее:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.section == 0) 
    { 
     self.firstSectionIndex = indexPath; 
    } 
    if (indexPath.section == 1) 
    { 
     self.secondSectionIndex = indexPath; 
    } 
    [tableView reloadData]; 
} 

Я искал состояние ячейки selecti чтобы быть сохраненным для долгосрочной ссылки, в поисках его я нашел полезную ссылку here.

Но он выбирает несколько ячеек и марку аксессуаров, которые применяются для всех строк в разделе. Я не понимаю, что не так. Можете ли вы направить меня на это!

Спасибо всем заранее :)

+0

погуглить не выпучив :) –

+0

Я заметил, что вы никогда не ясно, '' self.firstSectionIndex' или self.secondSectionIndex', которые не можете быть правы? – trojanfoe

+0

@ LithuT.V Отредактировано :), не могли бы вы помочь мне –

ответ

2

Я нашел точную и идеальное решение, благодаря Lithu TV и Nithin Gobel для того, чтобы направить меня в правильном направлении. К сожалению, их решения не помогли мне в достижении 1 галочки в каждом разделе, но несколько контрольных точек на самом деле. Так что я думал о сохранении выбранной строки в по умолчанию пользователя и для первоначального выбора 1-й строки каждого раздела, мы объявляем сначала и сек первая сделка Зонда индекс раздела, назначить путь индекса, а затем назначить мобильный вид аксессуара, как проверить mark.Here мы идем, давайте с cellForRowAtIndexPath:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *cellIdentifier = [NSString stringWithFormat:@"S%1dR%1d",indexPath.row,indexPath.section]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier]; 
     cell.backgroundColor = [UIColor clearColor]; 
     cell.textLabel.textColor = [UIColor whiteColor]; 
     NSUserDefaults *savedState = [NSUserDefaults standardUserDefaults]; 

     switch (indexPath.section) 
     { 
      case 0: 
      { 
       NSNumber *indexNumber = [NSNumber numberWithInteger:indexPath.row]; 
       if([[savedState objectForKey:@"firstSectionIndex"] isEqual: indexNumber]) 
       { 
        cell.accessoryType = UITableViewCellAccessoryCheckmark; 
        self.firstSectionIndex = indexPath; 
       } 

       if (indexPath.row == 0) 
       {      
        NSObject * checkedCellObject = [savedState objectForKey:@"firstSectionIndex"]; 
        if(checkedCellObject == nil) 
        { 
         self.firstSectionIndex = indexPath; 
         cell.accessoryType = UITableViewCellAccessoryCheckmark; 
        } 
        cell.textLabel.text = @"Yes"; 
       } 
       if (indexPath.row == 1) 
       { 
        cell.textLabel.text = @"No"; 
       } 
      } 
       break; 
      case 1: 
      { 
       NSNumber *indexNumber = [NSNumber numberWithInteger:indexPath.row]; 
       if([[savedState objectForKey:@"secondSectionIndex"] isEqual: indexNumber]) 
       { 
        cell.accessoryType = UITableViewCellAccessoryCheckmark; 
        secondSectionIndex = indexPath; 
       } 

       if (indexPath.row == 0) 
       { 
        NSObject * checkedCellObject = [savedState objectForKey:@"secondSectionIndex"]; 
        if(checkedCellObject == nil) 
        { 
         cell.accessoryType = UITableViewCellAccessoryCheckmark; 
         secondSectionIndex = indexPath; 
        } 
        cell.textLabel.text = @"Easy"; 
       } 
       if (indexPath.row == 1) 
       { 
        cell.textLabel.text = @"Medium"; 
       } 
       if (indexPath.row == 2) 
       { 
        cell.textLabel.text = @"Hard"; 
       } 
      } 
       break; 

      default: 
       break; 
     } 
    } 

    tableView.backgroundColor = [UIColor clearColor]; 
    tableView.backgroundView = nil; 

    return cell; 
} 

Учитывайте в каждом случае, мы проверяем, если проверяются состояние в сохраненные по умолчанию пользователя, если он равен нулю, мы проверяем 1-й ячейки (строки) в каждой секции, здесь мы идем методом табличное делегата, сделал выберите строку с индексом пути:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

    if (indexPath.section == 0) 
    { 
     UITableViewCell *checkCell = [tableView cellForRowAtIndexPath:indexPath]; 
     if(firstSectionIndex && firstSectionIndex != indexPath) 
     { 
      UITableViewCell *uncheckCell = [tableView cellForRowAtIndexPath:firstSectionIndex]; 
      uncheckCell.accessoryType = UITableViewCellAccessoryNone; 
     } 
     self.firstSectionIndex = indexPath; 
     [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:firstSectionIndex.row] forKey:@"firstSectionIndex"]; 
     checkCell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 

    if (indexPath.section == 1) 
    { 
     UITableViewCell *checkCell = [tableView cellForRowAtIndexPath:indexPath]; 
     if(secondSectionIndex) 
     { 
      UITableViewCell *unchekCell = [tableView cellForRowAtIndexPath:secondSectionIndex]; 
      unchekCell.accessoryType = UITableViewCellAccessoryNone; 
     } 
     self.secondSectionIndex = indexPath; 
     [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:secondSectionIndex.row] forKey:@"secondSectionIndex"]; 
     checkCell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 
} 

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

Надеется, что это помогает кто-то, спасибо :)

3

вы можете достичь его с помощью этой сильфона реализации кода: -

EDITED

.h файл

NSMutableArray *firstSelectedCellsArray; 
NSMutableArray *secondSelectedCellsArray; 
NSMutableArray *ThirdSelectedCellsArray; 

в .m файле

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.section == 0) 
    { 
     NSNumber *rowNumber = [NSNumber numberWithUnsignedInt:indexPath.row]; 

     UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath]; 
     if (selectedCell.accessoryType == UITableViewCellAccessoryNone) 
     { 
      selectedCell.accessoryType = UITableViewCellAccessoryCheckmark; 
      if ([firstSelectedCellsArray containsObject:rowNumber] ) 
      { 
       [firstSelectedCellsArray removeObject:rowNumber]; 
      } 
      else 
      { 
       [firstSelectedCellsArray addObject:rowNumber]; 
      } 
     } 
     else if (selectedCell.accessoryType == UITableViewCellAccessoryCheckmark) 
     { 
      if ([firstSelectedCellsArray containsObject:rowNumber] ) 
      { 
       [firstSelectedCellsArray removeObject:rowNumber]; 
      } 
      else 
      { 
       [firstSelectedCellsArray addObject:rowNumber]; 
      } 
      selectedCell.accessoryType = UITableViewCellAccessoryNone; 
     } 
    } 

    if (indexPath.section == 1) 
    { 
     NSNumber *rowNumber = [NSNumber numberWithUnsignedInt:indexPath.row]; 

     UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath]; 
     if (selectedCell.accessoryType == UITableViewCellAccessoryNone) 
     { 
      selectedCell.accessoryType = UITableViewCellAccessoryCheckmark; 
      if ([secondSelectedCellsArray containsObject:rowNumber] ) 
      { 
       [secondSelectedCellsArray removeObject:rowNumber]; 
      } 
      else 
      { 
       [secondSelectedCellsArray addObject:rowNumber]; 
      } 
     } 
     else if (selectedCell.accessoryType == UITableViewCellAccessoryCheckmark) 
     { 
      if ([secondSelectedCellsArray containsObject:rowNumber] ) 
      { 
       [secondSelectedCellsArray removeObject:rowNumber]; 
      } 
      else 
      { 
       [secondSelectedCellsArray addObject:rowNumber]; 
      } 
      selectedCell.accessoryType = UITableViewCellAccessoryNone; 
     } 
    } 
    if (indexPath.section == 2) 
    { 
     NSNumber *rowNumber = [NSNumber numberWithUnsignedInt:indexPath.row]; 

     UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath]; 
     if (selectedCell.accessoryType == UITableViewCellAccessoryNone) 
     { 
      selectedCell.accessoryType = UITableViewCellAccessoryCheckmark; 
      if ([ThirdSelectedCellsArray containsObject:rowNumber] ) 
      { 
       [ThirdSelectedCellsArray removeObject:rowNumber]; 
      } 
      else 
      { 
       [ThirdSelectedCellsArray addObject:rowNumber]; 
      } 
     } 
     else if (selectedCell.accessoryType == UITableViewCellAccessoryCheckmark) 
     { 
      if ([ThirdSelectedCellsArray containsObject:rowNumber] ) 
      { 
       [ThirdSelectedCellsArray removeObject:rowNumber]; 
      } 
      else 
      { 
       [ThirdSelectedCellsArray addObject:rowNumber]; 
      } 
      selectedCell.accessoryType = UITableViewCellAccessoryNone; 
     } 
    } 

} 

СЕЙЧАС в cellForRowAtIndexPath пут Littel кусок кода: -

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

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    if(indexPath.section==0) 
    { 

     NSNumber *rowNsNum = [NSNumber numberWithUnsignedInt:indexPath.row]; 
     if ([firstSelectedCellsArray containsObject:rowNsNum] ) 
     { 
      cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     } 
     else 
     { 
      cell.accessoryType = UITableViewCellAccessoryNone; 
     } 
    } 
    if(indexPath.section==1) 
    { 

     NSNumber *rowNsNum = [NSNumber numberWithUnsignedInt:indexPath.row]; 
     if ([secondSelectedCellsArray containsObject:rowNsNum] ) 
     { 
      cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     } 
     else 
     { 
      cell.accessoryType = UITableViewCellAccessoryNone; 
     } 
    } 
    if(indexPath.section==2) 
    { 

     NSNumber *rowNsNum = [NSNumber numberWithUnsignedInt:indexPath.row]; 
     if ([ThirdSelectedCellsArray containsObject:rowNsNum] ) 
     { 
      cell.accessoryType = UITableViewCellAccessoryCheckmark; 
     } 
     else 
     { 
      cell.accessoryType = UITableViewCellAccessoryNone; 
     } 
    } 

    return cell; 
} 

DEMO LINK

http://www.sendspace.com/file/z6oxg2

ScreenShot:

enter image description here

+0

Большое вам спасибо за ответ, но как насчет первоначальной установки галочки для первой строки в обоих разделах. Кроме того, я наблюдаю в вашем коде, NSIndexPath * checkedIndexPath не используется. –

+0

да, вы правы, извините за то, что его неиспользуемая переменная. Так что, как и ваш тик-раздел проверки, вы должны поместить в качестве раздела мудрый другой выбранный массив, например, у вас есть чтобы проверить первый раздел, как if (indexPath.section == 0), а затем использовать его в качестве ответа –

+0

Извините, что он не работает, я имею в виду, что галочка не применяется, t знать причину, почему, вот мой код реализации: http://pastebin.com/YWsRjAx6 –

1

для реализации галочки

  1. Keep массива индексов для выбранных индексов
  2. При проверке методы cellFor Row, если ток indexpath есть в выбранном массиве индекса .

если истинного

cell.accessoryType = UITableViewCellAccessoryCheckmark; 

еще

cell.accessoryType = UITableViewCellAccessoryNone; 
  1. В методе didSelect если индекс checkmarked.Remove из массива, а , как не установлен типа вспомогательного оборудования Никаких
  2. Если не аксессуар ни один добавьте галочку и добавьте индекс в массив.

EDIT

В случае, что вам нужно, это единственный каждый выбор Вы выбираете ячейку удалить все индексы из массива и добавить, что только и затем перезагрузить TableView

+0

I внедрили то, что вы предложили, но оно не работает так, как я ожидал, проблема сталкивается с проблемой множества контрольных меток, т. е. флажок предыдущей ячейки не исчезает после выбора другой ячейки (строки), моего кода реализации: http: // pastebin .com/XF7V66Hf –

+0

Отредактировал мой ответ –

+0

Я добавил эту строку [self.array removeAllObjects] в did select row method, но все же он разрешает выбор нескольких ячеек, галочку :( –