2011-10-11 6 views
2

J'ai un UITableView qui contient un tas d'éléments dont le statut me vient d'une application web chaque fois que la table se charge via une méthode refreshRows. Après je fais cela, je recharge la table.Recharger les données UITableView sans recharger la vue?

Lorsque j'ai ajouté un élément à ma table, je me suis retrouvé à recevoir un message "Mise à jour invalide: nombre de lignes invalides dans la section". Le rechargement des données dans la table s'est avéré nécessaire, donc j'ai fait le changement de l'ancienne à la nouvelle viewDidAppear méthodes (les deux montrés ci-dessous). J'ai maintenant deux reloadData appels, qui à la fois rafraîchir ma vue.

QUESTION: Y a-t-il une façon plus propre de faire cela? Après un ajout j'ai besoin de recharger mes données, mais je préfère ne pas recharger la vue jusqu'à ce que tous les statuts du web soient récupérés.

- (void)viewDidAppear:(BOOL)animated // new 
{ 
    NSLog(@"viewDidAppear"); 
    [super viewDidAppear:animated]; 

    [self.tableView reloadData]; // <------------- Prettier way to do this? 
    [self refreshRows]; 
    [self.tableView reloadData]; 

} 

- (void)viewDidAppear:(BOOL)animated // old 
{ 
    NSLog(@"viewDidAppear"); 
    [super viewDidAppear:animated]; 

    [self refreshRows]; 
    [self.tableView reloadData]; 

} 

- (void)refreshRows { 
    // foreach row get status from webapp 
} 

EDIT:

Voici le code demandé:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    id <NSFetchedResultsSectionInfo> sectionInfo = 
    [[self.fetchedResultsController sections] objectAtIndex:section]; 
    return [sectionInfo numberOfObjects]; 
} 
+0

pouvez-vous vous poster numberOfRowsInSection méthode? Ajoutez-vous des éléments à la table en utilisant insertRowsAtIndexPaths? l'erreur que vous avez mentionnée est généralement provoquée lorsque vous appelez la méthode insert tableView sans mettre à jour votre modèle. – adamsiton

+0

c'est ce qui se passe ... mais il existe un moyen de recharger le modèle sans recharger la vue? – nflacco

Répondre

4

Vous pouvez essayer de le faire de cette façon, si seulement votre source de données connaissent les changements (et doit observer ce point):

  1. Enregistrez votre TableView pour observer le centre de notifications pour les mises à jour de source de données.
  2. Envoyer une notification de la source de données à NSNotificationCenter cette mise à jour était arrivée.
  3. Réagissez pour la mise à jour dans TableView avec [self.tableView reloadData];

Dans la source de données:

- (void) dataSourceChanged 
{ 

    // All instances of TestClass will be notified 
    [[NSNotificationCenter defaultCenter] 
     postNotificationName:@"myUniqueDataSourceChanged" 
     object:self]; 

} 

Dans le tableau View Controller:

- (void)viewDidAppear:(BOOL)animated // new 
{ 
    NSLog(@"viewDidAppear"); 
    [super viewDidAppear:animated]; 

    [self.tableView reloadData]; // <------------- Prettier way to do this? 
    [self refreshRows]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(receiveNotification:) 
     name:@"myUniqueDataSourceChanged" 
     object:self.dataSource]; 
} 

- (void) receiveNotification:(NSNotification *) notification 
{ 
    if ([[notification name] isEqualToString:@"myUniqueDataSourceChanged"]) 
     [self dataSourceHasBeenChanged]; 
} 

- (void) dataSourceHasBeenChanged 
{ 

    [self.tableView reloadData]; 
    [self refreshRows]; 
} 

Cela mettra à jour votre Tableau sur chaque mise à jour de la source de données automatiquement

Questions connexes