2013-05-14 2 views
1

Les heures et les heures passées et aucune utilisation. Je ne comprends pas si je n'ai pas été efficace dans la recherche (googling) ou est-ce qu'il y a moins de questions à ce sujet ou J'ai peut-être commis une erreur en mettant en œuvre les réponses des experts!Définir une coche pour chaque section dans UITableView et enregistrer son état

Je sais qu'il y a plusieurs questions sur le réglage du type d'accessoire coche pour une ligne et aucun pour les autres lignes dans une section, les messages tracés here et there.

J'ai par défaut deux sections dans mon tableau. Par défaut, je veux que la première rangée de chaque section soit sélectionnée, c.-à-d. Avec la coche de l'accessoire. visible sur la ligne sélectionnée only.I ont essayé de déclarer deux chemins d'index pour garder la trace de la sélection de la ligne dans chaque section.Here est mon code de mise en œuvre:

-(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; 
} 

dans mon didSelectRowAtIndexPath, je l'ai fait ce qui suit:

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

J'ai cherché l'état de cellule sélecti sur pour être enregistré pour référence à long terme, en quête de celui-ci, j'ai trouvé un lien utile here.

Mais c'est la sélection de plusieurs cellules et le type d'accessoire coche est appliqué pour toutes les lignes dans la section.Je ne comprends pas ce qui ne va pas.Peut-on me guider s'il vous plaît !!

Merci à tous à l'avance :)

+0

googler pas goggling :) –

+0

Je remarque que vous jamais clair '' self.firstSectionIndex' ou self.secondSectionIndex', qui ne peut pas être vrai? – trojanfoe

+0

@ LithuT.V Edited :), pouvez-vous s'il vous plaît m'aider –

Répondre

2

J'ai trouvé un précis et Une solution parfaite, grâce à Lithu TV et à Nithin Gobel pour m'avoir orienté dans la bonne direction. Malheureusement, leurs solutions ne m'ont pas permis d'atteindre 1 coche par section, mais plusieurs coches en fait.J'ai donc pensé sauvegarder la ligne sélectionnée l'utilisateur par défaut et pour la sélection initiale de la première rangée de chaque section, nous déclarons d'abord et sec OND indice de section, attribuer au chemin d'index, puis assigner vue accessoire de cellule vérifier mark.Here nous allons, que la première affaire de avec 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; 
} 

S'il vous plaît observer dans chaque cas, nous vérifions si l'état vérifié est enregistrés par défaut de l'utilisateur, si elle est nulle, nous contrôlons 1ère cellule (ligne) de chaque section, nous allons ici avec la méthode vue de la table des délégués, a sélectionnez la ligne à chemin d'index:

-(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; 
    } 
} 

C'est, nous avons accompli avec succès une coche par section et également enregistrer l'état de l'accessoire de la cellule dans les valeurs par défaut de l'utilisateur pour référence à long terme.

Hope this helps quelqu'un, merci :)

3

vous pouvez y parvenir en utilisant ce code ci-dessous la mise en œuvre: -

ÉDITÉ

.h

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

dans le fichier .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; 
     } 
    } 

} 

NOW à cellForRowAtIndexPath mettre pièce littel de code: -

- (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

Merci beaucoup pour la réponse, mais que diriez-vous d'abord la mise en coche pour la première rangée dans les deux sections. Aussi j'observe dans votre code, NSIndexPath * checkedIndexPath n'est pas utilisé –

+0

oui vous avez raison désolé pour cela sa variable inutilisée.Ainsi que par votre section de vérification, vous devez mettre comme une section sage différent tableau sélectionné par exemple vous avez pour vérifier la première section comme si (indexPath.section == 0) cela et ensuite implémenter comme ma réponse –

+0

Désolé de dire, ça ne fonctionne pas, je veux dire la coche n'est pas appliquée, je ne fais pas Je connais la raison pour laquelle, voici mon code d'implémentation: http://pastebin.com/YWsRjAx6 –

1

pour la mise en œuvre checkmark

  1. Gardez un tableau d'index pour les index sélectionnés
  2. Dans la vérification de la méthode Ligne CellFor si indexPath actuelle est là dans le tableau d'index sélectionné .

si cela est vrai

cell.accessoryType = UITableViewCellAccessoryCheckmark; 

autre

cell.accessoryType = UITableViewCellAccessoryNone; 
  1. Dans la méthode didSelect si l'indice checkmarked.Remove de gamme, ainsi que définir le type d'accessoire ne
  2. Si aucun accessoire ajoutez la coche et ajoutez l'index dans le tableau.

EDIT

Dans le cas où ce dont vous avez besoin est à chaque fois de sélection unique vous sélectionnez une cellule supprimer tous les index de tableau et ajouter que seul puis recharger tableview

+0

I J'ai mis en œuvre ce que vous avez suggéré, mais cela ne fonctionne pas comme je l'avais prévu, le problème est confronté à plusieurs coches problème c.-à-d. cellule précédente ne disparaît pas après avoir sélectionné une autre cellule (ligne), mon code d'implémentation: http: // .com/XF7V66Hf –

+0

Edited ma réponse –

+0

J'ai ajouté cette ligne [self.array removeAllObjects] dans did sélectionnez la méthode de ligne, mais encore il permet la sélection de plusieurs cellules, coche :( –

Questions connexes