UITableView contentSize
Avoir un problème avec un couple de vues de table dans mon application.
Le problème se produit lorsque le contenu de la table de change (et donc le contenu de la tableview est plus grand).
Pour une raison quelconque, le contentSize de la UITableView reste le même sens, je ne peux pas faire défiler pour voir le nouveau contenu.
Ceci arrive quand une cellule particulière devient plus grand (après un [tableView reloadData];) ou quand je ajouter de nouvelles cellules (à l'aide de la NSFetchedResultsController délégué méthodes).
Est-il quelque chose que je dois faire pour la tableView de réajuster ses contentSize?
Modifier pour afficher le code, mais c'est juste réutilisable NSFetchedResultsController délégué code...
- (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 fait ce genre de chose avant d'en iOS5 et n'a jamais eu un problème avec elle. Semble que c'est potentiellement un iOS6 changement?
::EDIT::
La bêtise, c'est que j'ai un certain nombre d'autres UITableViewControllers dans la même application et ils sont tous fonctionne bien. Je peux ajouter de nouvelles cellules, d'ajouter dynamiquement la taille des cellules, de redimensionnement des cellules, etc... et les tables de tous les faire défiler correctement le haut et vers le bas tout le contenu.
Ce problème est en train de se passer sur un couple de tableview que j'ai ajouté récemment.
::EDIT::
OK, il suffit de faire un peu de débogage. Quand j'ai d'abord aller dans la Vue de Table de la contentSize.la hauteur est de 594.
Quand je puis ajouter un nouvel élément et de retourner dans le même tableviewController la contentSize.la hauteur est de 749.
Cependant, je ne peux pas faire défiler pour voir la nouvelle cellule en bas de la tableView. Il a juste l'habitude de défilement là. Il rebondit à l'ancienne contentSize hauteur.
- Si vous fournissez la bonne hauteur pour les cellules de
heightForRow:atIndexPath:
il devrait être ok. Êtes-vous mise à jour de la hauteur lorsque la cellule est censé être plus grand? - Je n'ai jamais nécessaire de modifier la contentsize lors de l'ajout de cellules. Quelles méthodes utilisez-vous? InsertRow? Pouvez-vous montrer un peu de code?
- Ouais, je suis réglage de la hauteur bien que la réelle de la cellule devient plus grande. Mais le fond de la tableview ne pas faire défiler par la quantité que la cellule de s'agrandir. c'est à dire si la cellule reçoit 50 points de plus que je ne peux pas défiler pour voir le bas de 50 points de la cellule. Aussi, la table où je suis en ajoutant de nouvelles cellules, toutes les cellules sont de la même taille, un peu plus d'eux. (comme un maître de détail du modèle, de la table de maître vue a un bouton + pour pousser à un contrôleur de créer un nouvel item qui est ensuite affichée dans le master) la nouvelle cellule est là, mais le défilement de la vue rebondit donc je ne peux pas le voir.
- ajouter un peu de code
- Si un contentSize valeur est droit et le support de table est à droite, alors peut-être contentInset est la raison?
- Vérifier
tableView:heightForRowAtIndexPath:
, dans mon cas, cette méthode a été le retour des valeurs négatives.
Vous devez vous connecter pour publier un commentaire.
J'ai été en cours d'exécution dans la même situation et a terminé avec cette solution de contournement. Je suis réglage de la
contentSize
juste après[self.tableView endUpdates];
J'ai eu le même problème à l'aide d'un affichage personnalisé contrôleur avec deux enfant de VC, l'une étant une tableview + extraites des résultats de contrôleur.
Je voudrais faire le point après l'ajout de contenu à partir d'un vc et pour en revenir à ma table que je ne serais pas capable de faire défiler de nouveau contenu au fond.
Donc, à mon tableview + extraites des résultats de contrôleur-je ajuster la taille du contenu basé sur le nombre de récupéré les objets que j'ai, peu importe d'où ils viennent.
Pire des cas, c'est que je n'ai pas à ajouter du contenu lors de la démonstration de la VC, mais le coût est minime.
J'ai dynamiques tableView avec "UITableViewAutomaticDimension'. Il se passe quelque chose et après recharger et c'est la taille du contenu est égal à la taille de l'image. Après que j'ai à la main de mettre du contenu taille de la table de limites de taille, tout fonctionne. J'espère que cette aide.
Et c'est après que j'ai fait le tableau.reloadData()
Essayez ceci:
J'ai rencontré similaires problème.Dans ma situation,je fais glisser une tableview à un affichage personnalisé contrôleur,qui est présentée par une poussée des enchaînements.Si la quantité de données a montré dans tableview dépasse un certain nombre,alors je ne peux pas toucher la cellule en bas de la tableview.
De nombreux moyens ont été essayés:jeu de l'image/taille du contenu de la vue de la table,et aucun ne fonctionne pour moi.Enfin,j'ai trouver la cause de racine et de le résoudre de façon simple(mais pas normalement).
Tout d'abord,la racine de la cause:la vue de la table créée par l'IB a une largeur plus grande que le son parent-vue-contrôleur.Ainsi,toutes les cellules en dehors de la vue est lié ne sera pas touché.
Donc,la solution est simple:Aller à la table de montage séquentiel,ajuster la largeur de la vue de la table,la rendre plus petite que la largeur de la vue parent.Il semble que si une table est créée par scénario,vous ne pouvez pas changer son image par le code.C'est ce que j'ai trouvé jusqu'à maintenant. Je suppose que c'est un bug de StoryBoard.
Espère qu'il sera utile pour vous.