Afficher une étiquette personnalisée lorsqu'aucune donnée n'est disponible pour tableView
À l'application en question a une possibilité pour les utilisateurs de marquer des éléments comme le favori. Lorsque l'utilisateur n'a pas de favoris enregistrés, je tiens à les informer de la réalité (surtout, je déteste l'idée d'un vide tableView).
Mon numberOfRowsInSection
est de zéro lorsqu'il n'y a pas des éléments que l'utilisateur a marqué comme favori. J'aimerais ensemble de la cellule.textLabel.text = @"Vous n'avez pas de favoris", mais quand il n'y a pas d'articles pour la table cellForRowAtIndexPath
n'est pas appelé.
J'ai pu tester numberOfRowsInSection
pour donner un résultat lorsqu'il rencontre un 0 puis testez pour 1 ligne dans cellForRowAtIndexPath
puis insérez le texte personnalisé mais alors que faire si ils ont un seul favori?
Mise à JOUR
J'ai essayé la mise en œuvre de l'idée que j'avais au-dessus, et a recommandé ci-dessous, mais peut-être que je ne suis pas en train de faire, probablement en raison du fait que c'est un fetchedResultsController avec le délégué méthodes pour mettre à jour la table quand un changement se produit.
J'obtiens cette erreur quand je supprime la cellule quand il n'y a qu'une seule cellule dans la table:
*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1447.6.4/UITableView.m:976
Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted). with userInfo (null)
et quand il n'y a pas que les cellules soient affichés en premier lieu, il se bloque avec:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[_PFBatchFaultingArray objectAtIndex:]: index (0) beyond bounds (0)'
Voici le code correspondant:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
//Return the number of rows in the section.
id <NSFetchedResultsSectionInfo> sectionInfo = [[_fetchedResultsController sections] objectAtIndex:section];
if ([sectionInfo numberOfObjects]==0) {
return 1;
} else {
return [sectionInfo numberOfObjects];
}
}
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
if ([[_fetchedResultsController sections] objectAtIndex:0]==0) {
cell.textLabel.text = @"You have no favorites";
} else {
Shows *show = [_fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = show.ShowsToSerials.serialName;
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@", show.showTitle];
}
}
source d'informationauteur Michael Morrison
Vous devez vous connecter pour publier un commentaire.
1) Dans mes propres applications iOS, j'ai créer un sous-vue avec un UILabel, en disant: "Pas de Résultats"
Lorsque numberOfSectionsInTableView est égal à zéro, j'ai ajouter de la sous-vue de la tableview. Quand il est != zéro, je le supprime.
Bien sûr, cela nécessite le maintien de la sous-vue dans la mémoire de la conservation d'un objet, de sorte que vous pouvez le supprimer.
2) Si vous voulez faire la même cellule que vous avez un peu de mentionner:
Lorsque numberOfSectionsInTableView est zéro, retour 1. Puis, dans numberOfRowsInSection retour 1.
Dans cellForRowAtIndexPath, vérifier à la fois numberOfSectionsInTableView et numberOfRowsInSection, et s'ils DOIVENT être à zéro (après tout, vous avez retourné 1), puis afficher ce message.
Solution 1 exige le maintien d'une variable pour contenir la sous-vue, mais est plus court et plus propre code, et je le crois de moins en moins de temps CPU (pas que causera des problèmes significatifs).
Modifier pour inclure le code:
Il était effectivement un peu différent que ce que je pensais, mais fondamentalement la même.
Il y a évidemment ici des choses qui doivent être modifiés pour s'adapter à votre code et le goût.
(Assurez-vous de déclarer UIView *nomatchesView;.h)
Ce que personnellement, je ne est la suivante.
Comme vous l'avez dit vous-même, dans la méthode numberOfRowsInSection vous devriez vérifier le décompte de votre tableView source de données, si ses 0 vous devez retourner 1 pour afficher le 1 cellule ous souhaitez.
Puis dans cellForRowAtIndexPath vous devriez vérifier le comte de nouveau, si elle retourne 0, vous savez que la vue de la table est de tenter de tirer votre "Vous n'avez pas encore de favoris" et vous pouvez définir le texte.
Comme indiqué dans le lien ci-dessous, il est facile si nous créer une étiquette et le définir comme arrière-plan de la vue pour UITableView comme ci-dessous. http://www.appcoda.com/pull-to-refresh-uitableview-empty/