2010-11-14 6 views
0

J'essaie de vérifier les éléments d'une visionnable, mais j'ai deux difficultés: 1. Je ne peux pas sélectionner le premier élément 2. si je sélectionne le 2ème et 3ème élément par exemple, cela sera également placer une coche près de la 5ème et 7ème et 9ème et 10ème etc etcCase à cocher pour UITableView

Voici mon code:

#pragma mark - 
#pragma mark Table View Data Source Methods 
- (NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section { 
    return [self.listArray count]; 
} 

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

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier]; 
    if (cell == nil) 
    { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil]; 
     for (id oneObject in nib) 
      if ([oneObject isKindOfClass:[CustomCell class]]) { 
       cell = (CustomCell *)oneObject; 
      } 
    } 


    NSUInteger row = [indexPath row]; 


    if ([selectedArray containsObject:cell]) 
    { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 
    else { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 

    [cell reloadInputViews]; 

    return cell; 
} 

- (NSIndexPath *)tableView:(UITableView *)tableView 
    willSelectRowAtIndexPath:(NSIndexPath *) indexPath{ 
    NSUInteger row = [indexPath row]; 
    if (row == 0) 
     return nil; 
    return indexPath; 
} 

- (void)tableView:(UITableView *)tableView 
didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSUInteger row = [indexPath row]; 

    UITableViewCell *c = [tableView cellForRowAtIndexPath:indexPath]; 
    if ([selectedArray containsObject:c]) 
    { 
     c.accessoryType = UITableViewCellAccessoryNone; 
     [selectedArray removeObject:c]; 
     [selectedIndexes removeObject:[NSNumber numberWithInt:row]]; 
    } 
    else { 
     c.accessoryType = UITableViewCellAccessoryCheckmark; 
     [selectedArray addObject:c]; 
     [selectedIndexes addObject:[NSNumber numberWithInt:row]]; 
    } 
} 

- (CGFloat) tableView:(UITableView *)tableView 
heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return kTableViewRowHeight; 
} 

- (void)refreshDisplay:(UITableView *)tableView { 
    [tableView reloadData]; 
} 

J'ai essayé d'utiliser

NSString *identifier = [NSString stringWithFormat:@"Cell %d", indexPath.row]; 

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:identifier]; 

à la place, mais qui a fait disparaître la coche lors du défilement

Répondre

2

Votre logique suppose que chaque ligne possède son propre objet cellule. Cependant, l'article dequeueReusableCellWithIdentifier signifie que vous réutilisez les objets de la cellule (c'est-à-dire lorsqu'une cellule défile en haut de l'écran, elle est réutilisée en bas de l'écran). Vous devez refaire votre logique pour ne pas faire cette supposition.

De même, if (row == 0) return nil; dans willSelectRowAtIndexPath est ce qui vous empêche de sélectionner la première ligne. Débarrassez-vous de cette ligne.

+0

merci pour la réponse, quelles sont les alternatives à l'utilisation de dequeueReusableCellIdentifier s'il vous plaît? – Lilz

1

Vous ne pouvez pas sélectionner le premier élément à cause de cela:

- (NSIndexPath *)tableView:(UITableView *)tableView 
    willSelectRowAtIndexPath:(NSIndexPath *) indexPath{ 
    NSUInteger row = [indexPath row]; 
    if (row == 0) 
     return nil; 
    return indexPath; 
} 

pour le reste, ne pas stocker les cellules, indexpaths de magasin. Les cellules peuvent être réutilisées, ce qui causera des problèmes tôt ou tard. Peut-être que cela cause les problèmes que vous avez en ce moment. Et enregistrer ces chemins d'index dans un NSMutableSet

+0

Avec NSIndexPath vous pouvez obtenir le même objet ou des objets différents pour la même valeur - gardez cela à l'esprit lors du stockage. – Eiko