2012-09-11 1 views
2

Dans un contrôleur de vue (onglet 1), je charge à partir des données de base comme ceci:faute de base de données frustration

- (void)loadRecordsFromCoreData { 

[self.managedObjectContext performBlockAndWait:^{ 
    NSError *error = nil; 
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Item"]; 
    [request setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"order" ascending:YES]]]; 

    self.items = [self.managedObjectContext executeFetchRequest:request error:&error]; 

}]; 
} 

J'afficher ensuite les articles comme celui-ci (en viewDidAppear):

- (void)displayItems 
{ 
for(UIView *subview in [self.itemRow subviews]) { 
    [subview removeFromSuperview]; 
} 

int xPos = kXItemOffsetIphone; 

for (Item *item in self.items) { 
    ItemView *itemView = [[ItemView alloc] initWithFrame:CGRectMake(xPos, kYItemOffsetIphone, kItemWidthIphone, kItemHeightIphone) ]; 

    [itemView layoutWithData:item]; 

    [self.itemRow addSubview:itemView]; 

    xPos += kXItemSpacingIphone; 
} 

} 

ItemView est une sous-classe UIView qui affiche l'image associée à l'élément, etc. Lorsque je lance l'application pour la première fois, tous les éléments sont affichés. Cependant, si je clique sur un autre onglet, puis revenons à l'onglet 1, tous mes éléments disparaissent. Le tableau d'éléments est toujours là, mais chaque élément du tableau est un "défaut", donc rien ne s'affiche. Très frustrant. Comment puis-je empêcher ces articles de devenir des «failles»?

Répondre

4

Il semble que votre NSManagedObjectContext soit désalloué (votre contrôleur de vue est peut-être déchargé/nettoyé lorsque vous changez d'onglet?). En coulisses, vos objets ne sont que des proxies pour les données entrant et sortant de votre magasin SQLite et entre un cache géré par le NSManagedObjectContext. Lorsque le contexte est désalloué, les objets proxy existent toujours (d'où la raison pour laquelle votre tableau est toujours rempli d'objets) mais ils ne peuvent pas demander le contexte d'objet géré désalloué pour les données et toutes leurs valeurs retournent en défaut.

Vous avez quelques options:

Vous pouvez passer autour d'une référence à votre NSManagedObjectContext que vous vous déplacez entre les contrôleurs de sorte que vous ne perdez pas.

Vous pouvez récupérer vos données dans -viewWillAppear: ou une autre méthode que vous trouvez commode à chaque fois que votre vue est affichée.

Vous pouvez également déplacer votre NSManagedObjectContext sur un objet singleton qui existe pour la durée de vie de l'application, mais qui peut devenir cassant si vous ne faites pas attention.

+1

Merci, c'était précisément cela (le contexte ne persiste pas). Je ne regarde pas de re-chercher de coredata à moins que la vue soit complètement déchargée donc j'essayais d'éviter de le faire à chaque fois dans viewWillAppear. Fonctionne maintenant lorsque vous utilisez le bon contexte. – soleil

+0

Ceci est certainement une excellente solution. Résolu mes problèmes ... –