2011-10-12 4 views
0

Je sais que ça va être un de ces moments de tête-claquant.UITableView didSelectRowAtIndexPath a seulement déclenché quelques fois

J'ai une UITableView à partir de laquelle j'ai besoin de supprimer des cellules. Le problème est que didSelectRowAtIndexPath n'est appelé que si je tape d'abord la ligne, puis balayez pour afficher le bouton de suppression. Si je balaye la ligne sans tapoter explicitement la ligne, j'obtiens une erreur EXC_BAD_ACCESS. J'ai mis un NSLog dans didSelectRowAtIndexPath et peux voir le tableau d'indexPath quand je tape la cellule, mais rien si je fais simplement glisser sans cliquer.

J'ai fait ma part de recherche et je suis sûr à 99% que mon délégué est correctement connecté (habituellement le problème # 1) et n'a pas tapé didDeselectRowAtIndexPath (habituellement problème # 2). J'ai aussi dans mon fichier .h (problème # 3).

Merci d'avance.


EDIT:

Je l'ai dit: Si je glisser la ligne sans taper explicitement la ligne, je reçois une erreur de EXC_BAD_ACCESS quand je tape sur le bouton Supprimer. Si je tape sur la cellule, puis glisser, je peux appuyer sur Supprimer et il supprime comme prévu.


EDIT:

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

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

    NSSortDescriptor *aSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; 
    [bandList sortUsingDescriptors:[NSArray arrayWithObject:aSortDescriptor]];  

    NSDictionary *dict = [bandList objectAtIndex:indexPath.row]; 
    cell.textLabel.text = [dict objectForKey:@"name"]; 

    return cell; 
} 

- (void)tableView: (UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath 
{ 
    NSLog(@"IndexPath: %@", [indexPath description]); 
} 

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 

     NSDictionary *selectedBand = [bandList objectAtIndex:indexPath.row]; 
     NSString *selectedBandId = [selectedBand objectForKey:@"id"]; 
     [self deleteMyBand:selectedBandId]; 
     bandList = [self getSavedBands]; 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 

    } 
} 
+0

Veuillez publier votre code pour didSelectRowAtIndexPath, les méthodes de délégation de suppression et cellForRowAtIndexPath. –

+0

Merci pour votre aide, @XcodeDev. J'ai mis à jour le message original. – voodoobilly

+0

Vous triez votre 'bandList' à chaque fois que tableView vous demande une nouvelle cellule. 'cellForRowAtIndexPath' n'est pas le meilleur endroit pour préparer vos données. De plus, si 'bandList' change avec le temps, votre tableView deviendra incohérent. – kelin

Répondre

0

Ces lignes sautent me:

NSDictionary *selectedBand = [bandList objectAtIndex:indexPath.row]; 
NSString *selectedBandId = [selectedBand objectForKey:@"id"]; 

Je ne comprends pas votre raisonnement pour prendre une valeur d'un tableau, coller dans un dictionnaire, puis obtenir une chaîne de ce dictionnaire. Ne doit pas la valeur retournée par

[bandList objectAtIndex:indexPath.row];

Soyez le même que ce que vous obtenez dans selectedBandId?

Aussi, je ne peux l'analyser plus loin quand je ne sais pas ce que « deleteMyBand » et "getSavedBands" faire. Essayez de commenter ces appels et de voir si la ligne visible elle-même peut être supprimée. Cela peut vous dire où est le problème.

+0

bandList est un tableau de dictionnaires. Je dois obtenir le dictionnaire pour pouvoir sortir le bandId.Tout 'delete' et 'get' font est de supprimer/lire un tableau de dictionnaires à partir d'un plist. J'apprécie votre contribution, mais je suis juste en train d'essayer de comprendre pourquoi une cellule de frappe/cellule de balayage/robinet Supprimer fonctionne mais une cellule de balayage/appuyez sur Supprimer ne déclenche pas didSelectRowAtPath. Cela semble être plus un problème de délégué UITableView pour moi, bien que je ne peux pas résoudre le problème moi-même, alors qu'est-ce que je sais. – voodoobilly

+0

J'imagine que cela a quelque chose à voir avec l'appel de la ligne du tableau actuellement sélectionnée dans 'deleteMyBand' ou 'getSavedBands'. Je ne sais pas pourquoi ces deux lignes NSDictionary et NSString me dérangeaient; ça semble évident maintenant. –

0

Je ne sais pas exactement pourquoi, mais le fait que j'utilisais un NSMutableArray trié pour mes données source semble avoir été le problème. Lorsque j'ai supprimé la ligne de la table et mis à jour le MutableArray, j'ai eu le crash. Toutefois, si j'ai créé mes données source en tant que NSArray, que j'ai créé une table mutableCopy du tableau dans un MutableArray temporaire, supprimé la ligne, recouru au tableau, puis réécrit le MutableArray sur un NSArray, tout est pêché.

Je ne pense pas que cette explication ait un sens, mais c'est le modèle que je vois. Si quelqu'un peut penser à pourquoi cela pourrait fonctionner, s'il vous plaît éclairer moi. Mon instinct me disait que c'était le genre, mais mon instinct n'a pas été correct ces derniers temps.

Questions connexes