Si vous avez suivi les lignes directrices Apple Guide de mise en œuvre du modèle d'objet lorsque vous créez votre modèle de données objets, vous pouvez gérer vos mises à jour en utilisant UITableView KVO. Cela vous évite d'avoir à répandre des appels à reloadData, insertRowsAtIndexPaths: withRowAnimation: ou deleteRowsAtIndexPaths: withRowAnimation: tout au long de votre classe contrôleur où les données de votre table peut se changer.
Au lieu de cela, tout ce que vous avez à faire est d'observer l'keypath sur votre objet modèle de données qui contient la collection d'objets d'être affichées dans le tableau. La meilleure façon de faire qui est dans la méthode viewDidLoad votre contrôleur de tableau, comme ceci:
Ensuite, il vous suffit œuvre observeValueForKeyPath: ofObject: le changement: le contexte d'insérer ou de supprimer des lignes en fonction des changements observés à la collecte. Les informations sur les lignes qui ont été insérées ou supprimées vient dans le dictionnaire modifications stockées sous la NSKeyValueChangeIndexesKey clés. L'information vient sous la forme d'ensembles d'index, et ceux qui doivent être convertis en chemins d'index afin de mettre à jour la table. Mais c'est la seule chose sur ce code qui n'est pas assez simple, et cette mise en œuvre est assez générique, donc vous devriez être capable de copier à peu près et de le coller dans votre contrôleur si vous voulez l'utiliser.
Si vous ne faites cela, assurez-vous de supprimer tous les autres appels retirer et insérer, sinon vous allez supprimer double et double-insert, ce qui provoquera des erreurs à l'exécution.
Une fois que vous avez fait cela, vous pouvez oublier rechargement de votre table. Toute modification apportée aux données sous-jacentes - même les modifications apportées sur d'autres threads (en supposant que votre classe de modèle de données est thread-safe) déclenchera automatiquement une suppression ou l'insertion d'animation. Bien que le code ci-dessus peut sembler un peu intimidant, cela permet effectivement une conception beaucoup plus propre en général.
J'ai créé un assez simple projet Xcode qui illustre à l'aide KVO de mettre à jour une vue de table.
Au lieu de cela, tout ce que vous avez à faire est d'observer l'keypath sur votre objet modèle de données qui contient la collection d'objets d'être affichées dans le tableau. La meilleure façon de faire qui est dans la méthode viewDidLoad votre contrôleur de tableau, comme ceci:
[self.data addObserver:self
forKeyPath:@"items"
options:0
context:NULL];Ensuite, il vous suffit œuvre observeValueForKeyPath: ofObject: le changement: le contexte d'insérer ou de supprimer des lignes en fonction des changements observés à la collecte. Les informations sur les lignes qui ont été insérées ou supprimées vient dans le dictionnaire modifications stockées sous la NSKeyValueChangeIndexesKey clés. L'information vient sous la forme d'ensembles d'index, et ceux qui doivent être convertis en chemins d'index afin de mettre à jour la table. Mais c'est la seule chose sur ce code qui n'est pas assez simple, et cette mise en œuvre est assez générique, donc vous devriez être capable de copier à peu près et de le coller dans votre contrôleur si vous voulez l'utiliser.
Si vous ne faites cela, assurez-vous de supprimer tous les autres appels retirer et insérer, sinon vous allez supprimer double et double-insert, ce qui provoquera des erreurs à l'exécution.
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
NSIndexSet *indices = [change objectForKey:NSKeyValueChangeIndexesKey];
if (indices == nil)
return; // Nothing to do
// Build index paths from index sets
NSUInteger indexCount = [indices count];
NSUInteger buffer[indexCount];
[indices getIndexes:buffer maxCount:indexCount inIndexRange:nil];
NSMutableArray *indexPathArray = [NSMutableArray array];
for (int i = 0; i < indexCount; i++) {
NSUInteger indexPathIndices[2];
indexPathIndices[0] = 0;
indexPathIndices[1] = buffer[i];
NSIndexPath *newPath = [NSIndexPath indexPathWithIndexes:indexPathIndices length:2];
[indexPathArray addObject:newPath];
}
NSNumber *kind = [change objectForKey:NSKeyValueChangeKindKey];
if ([kind integerValue] == NSKeyValueChangeInsertion) // Rows were added
[self.tableView insertRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationFade];
else if ([kind integerValue] == NSKeyValueChangeRemoval) // Rows were removed
[self.tableView deleteRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationFade];
}Une fois que vous avez fait cela, vous pouvez oublier rechargement de votre table. Toute modification apportée aux données sous-jacentes - même les modifications apportées sur d'autres threads (en supposant que votre classe de modèle de données est thread-safe) déclenchera automatiquement une suppression ou l'insertion d'animation. Bien que le code ci-dessus peut sembler un peu intimidant, cela permet effectivement une conception beaucoup plus propre en général.
J'ai créé un assez simple projet Xcode qui illustre à l'aide KVO de mettre à jour une vue de table.
Aucun commentaire:
Enregistrer un commentaire