2013-10-17 1 views
1

J'ai donc cherché une réponse à ce problème intéressant que j'ai rencontré mais qui n'a pas eu beaucoup de chance. Fondamentalement, j'ai un UITableView préchargé sur le lancement initial de l'application avec quelques objets en utilisant CoreData, et la possibilité pour l'utilisateur d'ajouter plus.Renvoyer NO sur canEditRowAtIndexPath, mais peut modifier si défilée

J'autorise la suppression de cellules dans la table, à l'exception des éléments que j'ai pré-chargés initialement. J'effectue donc une vérification dans ma méthode canEditRowAtIndexPath et renvoie NO si l'élément sélectionné est l'un de ces éléments préchargés. Tout fonctionne bien jusqu'à ce que je descende assez loin pour que l'un des éléments soit en dehors de l'écran, et puis quand il réapparaît l'élément qui ne devrait pas être modifiable, est maintenant modifiable. Je suis assez nouveau dans le développement iOS, donc j'espère que c'est un problème plutôt amateur - mais je n'arrive pas à trouver la réponse.

Toute aide est appréciée.

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    DataLayer *dl = [DataLayer alloc]; 

    // Get all items from Favorites 
    NSArray *results = [dl FetchAll:@"Favorites"]; 

    // Get currently selected cell properties 
    FavoritesTableCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath]; 
    Favorites *fav = [Favorites alloc]; 
    NSMutableArray *genItems = [[NSMutableArray alloc] init]; 

    // Get only records that are default app items 
    for(int a = 0; a < [results count]; a++){ 
     fav = [results objectAtIndex:a]; 

     if ([fav.generic isEqualToNumber:[NSNumber numberWithInt:1]]) { 
      [genItems addObject:fav]; 
     } 
    } 

    // Loop through default items to determine if editable 
    for (int i = 0; i < [genItems count]; i++) { 
     fav = [genItems objectAtIndex:i]; 

     if ([fav.title isEqualToString:[selectedCell.nameLabel text]]) { 
      return NO; 
     } 
    } 
    return YES; 
} 
+0

aucun moyen d'aider sans le code – danh

Répondre

2

La racine du problème est que cette méthode est qu'elle fonde de réponse sur le contenu d'une cellule de vue de la table (selectedCell) plutôt que le modèle.

Les vues de table réutilisent les cellules. Au fur et à mesure que l'on fait défiler la vue, les "nouvelles" cellules qui apparaissent sont en réalité les mêmes objets qui ont juste disparu de l'autre côté de la table. De sorte que selectedCell n'est pas une bonne référence pour une question qui devrait être posée à votre modèle.

Le code doit être structuré comme celui-ci:

Votre modèle est un NSMutableArray qui commence par quelques éléments que vous ajoutez. Vous devez savoir quels éléments sont des originaux, ne doit pas être retiré:

@property (nonatomic, strong) NSMutableArray *favorites; 
@property (nonatomic, assign) NSMutableArray *genericFavorites; 

// at init, imagine these strings are your preloaded core data 

[self.genericFavorites addObject:@"generic favorite object a"]; 
[self.genericFavorites addObject:@"generic favorite object b"]; 
[self.favorites addItemsFromArray:self.genericFavorites]; 

Vous utiliserez self.favorites comme modèle, qui est lorsque la vue de la table demande numberOfRowsInSection, vous répondrez self.favorites.count. Dans cellForRowAtIndexPath, vous recherchez l'élément dans self.favorites[indexPath.row] et configurez la cellule avec les données de cet objet. self.genericFavorites vous permet juste de vous rappeler quels objets sont originaux, non ajoutés par l'utilisateur.

Si l'ordre reste fixe, votre logique canEditRow est simple:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
    return indexPath.row >= self.genericFavorites.count; 
} 

Mais si, comme peut-être votre code implique, l'utilisateur peut réorganiser ces éléments, votre canEditRow a plus de travail à faire, mais il peut faire ce travail sans référence aux cellules du tableau (qui, comme je l'ai indiqué, ne sont pas fiables):

// get the object at indexPath.row from our model. Answer NO if that object was preloaded 
// from the app (if genericFavorites containsObject:), YES otherwise 

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 

    Favorite *favorite = self.favorites[indexPath.row]; // this is your model after user has edited, reordered, etc 
    return ![self.genericFavorites containsObject:favorite]; 
} 
+0

fonctionnait très bien! Merci d'avoir pris le temps de me montrer la bonne façon d'effectuer cette vérification. – DerekH

Questions connexes