Avoir un problème avec quelques vues de table dans mon application.
Le problème se produit lorsque le contenu de la table change (et par conséquent le contenu de la table devient plus grand).
Pour une raison quelconque, la taille du contenu de UITableView reste la même, je ne peux pas faire défiler l'écran pour voir le nouveau contenu.
Cela se produit lorsqu'une cellule particulière devient plus grande (après un [tableView reloadData];) ou lorsque j'ajoute de nouvelles cellules (à l'aide des méthodes de délégation NSFetchedResultsController).
Dois-je faire quelque chose pour que tableView réajuste son contentSize?
Modifier pour afficher le code, mais il ne s'agit que du code délégué du délégué NSFetchedResultsController ...
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
// The fetch controller is about to start sending change notifications, so prepare the table view for updates.
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:(OJFPunchListCell*)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray
arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray
arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id )sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
switch(type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
// The fetch controller has sent all current change notifications, so tell the table view to process all updates.
[self.tableView endUpdates];
}
J'ai déjà fait ce genre de chose dans iOS5 et je n'ai jamais eu de problème avec ça. Semble-t-il potentiellement un changement iOS6?
::MODIFIER::
La chose stupide à propos de cela est que j'ai un certain nombre d'autres UITableViewControllers dans la même application et qu'ils fonctionnent tous bien. Je peux ajouter de nouvelles cellules, ajouter des cellules dimensionnées de manière dynamique, redimensionner des cellules, etc., et les tableaux défilent correctement de haut en bas dans tout le contenu.
Ce problème se produit maintenant sur quelques tablesview que j'ai ajoutées récemment.
::MODIFIER::
OK, je fais juste du débogage. Lorsque je vais pour la première fois dans la vue tableau, le contentSize.height est 594.
Lorsque j'ajoute un nouvel élément et que je retourne dans le même tableauviewController, le contentSize.height est 749.
Cependant, je ne peux pas faire défiler pour voir la cellule nouvellement ajoutée au bas de la tableView. Il ne veut tout simplement pas défiler là. Il rebondit à l'ancienne hauteur contentSize.
J'ai rencontré le même problème et je me suis retrouvé avec cette solution de contournement. Je règle la contentSize
juste après le [self.tableView endUpdates];
[self.tableView endUpdates];
NSLog(@"%f", self.tableView.contentSize.height);
self.tableView.contentSize = [self.tableView sizeThatFits:CGSizeMake(CGRectGetWidth(self.tableView.bounds), CGFLOAT_MAX)];
NSLog(@"%f", self.tableView.contentSize.height);
[self.tableView setContentInset:UIEdgeInsetsMake(50, 0, -50, 0)];
J'ai eu le même problème en utilisant un contrôleur de vue personnalisé avec deux VC enfants, l'un étant un contrôleur de résultats tableview +.
J'arriverais au fait après avoir ajouté le contenu d'un vc et revenir à ma table que je ne serais pas en mesure de faire défiler le nouveau contenu en bas.
Donc, dans mon contrôleur de résultats tableview + fetched, j'ajuste la taille du contenu en fonction du nombre d'objets récupérés que j'ai, quelle que soit leur origine.
Le pire scénario est que je n’ajoute aucun contenu lors de l’affichage du VC, mais que le coût est minime.
//In my tableview + fetched results controller class
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSUInteger objCount = self.fetchedResultsController.fetchedObjects.count;
//My custom cell has a height of 50.0f, yours may not!
CGFloat tableHeight = objCount * 50.0f;
NSLog(@"%i objects, total height: %f",objCount,tableHeight);
[self.tableView setContentSize:CGSizeMake(self.tableView.contentSize.width, tableHeight)];
}
J'ai tableView dynamique avec 'UITableViewAutomaticDimension'. Quelque chose se passe et après rechargement et sa taille de contenu est égale à sa taille de trame. Après avoir mis manuellement la taille du contenu en tant que taille de la table, tout fonctionne. J'espère que ça aide.
table.beginUpdates()
table.contentSize = CGSize(width: table.bounds.width, height: table.bounds.height)
table.endUpdates()
Et c'est après que j'ai fait table.reloadData ()