scrollToRowAtIndexPath avec UITableView ne fonctionne pas
J'ai dans iOS8 une vue de table comme ceci:
tableView = UITableView(frame: view.bounds, style: .Plain)
view.addSubview(tableView)
Lorsque l'utilisateur tape et envoie du texte dans le clavier, l'application ivoke la méthode suivante pour faire défiler la tableView. Le but est d'afficher le texte à l'écran (comme un chat)
let numberOfRows = tableView.numberOfRowsInSection(0)
if numberOfRows > 0 {
let indexPath = NSIndexPath(forRow: numberOfRows-1, inSection: 0)
tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: UITableViewScrollPosition.Bottom, animated: animated)
}
Mais la vue de la table ne sont pas faites défiler jusqu'à la bootom.
Quelqu'un a une solution?
Merci.
Explication:
Définition de la classe:
class ChatViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UITextViewDelegate
puis-je avoir la définition de la vue de la table:
var tableView: UITableView!
dans le viewDidLoad:
tableView = UITableView(frame: view.bounds, style: .Plain)
tableView.dataSource = self
tableView.delegate = self
view.addSubview(tableView)
puis-je l'appeler pour le code qui devrait rendre le défilement (deuxième bloc de code sur ma réponse).
Lorsque je lance l'application j'attends la tableview pour faire défiler vers le bas, mais il ne fonctionne pas.
Vous devez vous connecter pour publier un commentaire.
La solution ci-dessous a fonctionné pour moi. C'est une combinaison de solutions trouvées sur StackOverflow. Je l'ai appelé "
scrollToRowAtIndexPath
" après un très court délai.appelé par :
Swift 3
TableViewDelegate
et remplacerreloadData
; execute sur le thread principal avecdispatch_asynch
, etc.) pour faire défiler vers le bas, aucune d'entre elles semblent plus travailler pour iOS 9.La solution à mon problème est le suivant:
let numberOfRows = tableView.numberOfRowsInSection(numberOfSections-1)
sinumberOfSections
est 0Essayer de rechargement d'abord avant d'appeler les faire défiler. Très weired, mais travaille pour iOS8.
SWIFT 3 VERSION de @Fox5150 réponse, avec une extension :
UTILISATION:
J'ai le problème avec un plus grand indice de dire que même 15. Seuls les indices jusqu'à 5-6 utiliser pour travailler. En faisant de "l'animation: false," scrollToRowAtIndexPath() a parfaitement fonctionné.
La meilleure solution consiste à basculer la tête en bas de la tableView de sorte que vous pouvez montrer à nouveau le message juste en
-insertRowsAtIndexPaths:withRowAnimation:
pour ce faire, il vous faut d'abord retourner votre table par:
alors n'oubliez pas de retourner vos cellules, le meilleur endroit pour le faire en awakeFromNib par sous-classement:
C'est simple. Il suffit de faire l'opération de défilement dans viewDidLayoutSubViews()
Il semble que tableview pourrait obtenir la bonne positon après sa mise en page des sous-vues.
Si le clavier est toujours visible, vous devez définir le
UITableView
'scontentInset
propriété pour compenser la hauteur du clavier en bas de l'écran. Sinon, votre cellule peut être caché derrière le clavier parce que leUITableView
ne sais pas que la moitié de son contenu est caché par elle.Ou utiliser un
UITableViewController
qui gère cela automatiquement.Appel scrollToLastPosition() la méthode après le chargement de la tableview comme appel de viewWillAppear( ) ou après la vue de la table de recharger quand quelque chose a changé dans tableview
Heres Swift 3 version
Tous les codes ci-dessus sont très bien, mais dans mon cas, quand je veux charger le
tableView
ainsi que le défilement vers le bas de latableView
instantanément lorsque le contrôleur de charge, pour que la situation ci-dessus sont les méthodes de prendre le temps de défiler vers le bas de latableView
. J'ai donc suivi ces codes.Remplacer
tableView
recharger commeÉcrites faites défiler vers le bas de la méthode comme suit:
puis recharger
tableView
lors de chargements de données complète de service web ou à partir d'une base de données d'entité:Maintenant son travail lisse comme je le voulais.
Je sais que c'est un vieux thread, mais c'est toujours d'actualité. Au lieu de traiter avec des délais d'attente qui peuvent parfois ne pas être au bon moment, à l'utilisation synchrone de blocs sur le thread principal (normalement pas quelque chose que je ferais, mais nous parlons millisecondes):
Cela fonctionne toujours pour moi.