Juste curieux, car cela ne semble pas immédiatement possible, mais existe-t-il un moyen sournois de tirer parti de la nouvelle UIRefreshControl
classe iOS 6 sans utiliser de UITableViewController
sous-classe?
J'utilise souvent un UIViewController
avec une sous- UITableView
vue et je me conforme UITableViewDataSource
et UITableViewDelegate
plutôt que d'utiliser UITableViewController
carrément un .
UITableViewController
fichier et déposer un bug demandant une API pour utiliser unUIRefreshControl
avec unUITableView
directement.Réponses:
Sur une intuition, et basé sur l'inspiration de DrummerB, j'ai essayé d'ajouter simplement une
UIRefreshControl
instance comme sous-vue à monUITableView
. Et ça fonctionne comme par magie!Cela ajoute une vue
UIRefreshControl
au - dessus de votre table et fonctionne comme prévu sans avoir à utiliser unUITableViewController
:)EDIT: Ceci ci-dessus fonctionne toujours mais comme certains l'ont souligné, il y a un léger "bégaiement" lors de l'ajout de l'UIRefreshControl de cette manière. Une solution à cela consiste à instancier un UITableViewController, puis à définir votre UIRefreshControl et UITableView à cela, c'est-à-dire:
la source
-[UITableViewController setRefreshControl:]
) continuera de fonctionner.handleRefresh:
il y ait un changement inattendu de la valeur de la vue de défilementcontentInsets
pendant une fraction de seconde. Quelqu'un d'autre en fait l'expérience ou a-t-il une solution? (yup, je sais que ce n'est pas pris en charge en premier lieu!)UITableViewController
et vous "le ferez bien".[_tableView insertSubview:_refreshControl atIndex:0];
. Testé avec iOS 7 et 8;)Pour éliminer le bégaiement provoqué par la réponse acceptée, vous pouvez attribuer votre
UITableView
à aUITableViewController
.ÉDITER:
Une façon d'ajouter un
UIRefreshControl
sansUITableViewController
avec aucun bégaiement et de conserver la belle animation après avoir actualisé les données sur la table.Plus tard lors de la manipulation des données actualisées ...
la source
[_tablewViewController didMoveToParentViewController:self];
après avoir ajouté la sous-vue.self.tableView = _tableViewController.tableView;
devrait être_tableViewController.tableView = self.tableView
Ce que vous essayez d'utiliser, c'est d'utiliser la vue conteneur dans ViewController que vous utilisez. vous pouvez définir une sous-classe UITableViewController propre avec une vue de table dédiée et la placer dans ViewController.
la source
self.childViewControllers.firstObject
.prepareForSegue
pour obtenir une référence à l'objet UITableViewController dans une vue de conteneur, car il est immédiatement déclenché en tant qu'événement de séquence lors de l'instanciation du storyboard.Eh bien, UIRefreshControl est une sous-classe UIView, vous pouvez donc l'utiliser seule. Je ne sais pas trop comment cela se rend. Le rendu pourrait simplement dépendre de la trame, mais il pourrait également s'appuyer sur un UIScrollView ou le UITableViewController.
Quoi qu'il en soit, cela va être plus un hack qu'une solution élégante. Je vous recommande de regarder dans l'un des clones tiers disponibles ou d'écrire le vôtre.
ODRefreshControl
SlimeRefresh
la source
Essayez de retarder l'appel à la
-endRefresh
méthode refreshControl d'une fraction de seconde après que la tableView a rechargé son contenu, en utilisant NSObject-performSelector:withObject:afterDelay:
ou GCD.dispatch_after
.J'ai créé une catégorie sur UIRefreshControl pour cela:
Je l'ai testé et cela fonctionne également sur les vues de collection. J'ai remarqué qu'un délai aussi petit que 0,01 seconde suffit:
la source
UIRefreshControl
.[self performSelector:@selector(endRefreshing) withObject:nil afterDelay:0.01]
-performSelector:withObject:afterDelay:
ou GCD, c'est une question de goût personnel.c'est simple
Si vous souhaitez en savoir plus sur iOS 10 UIRefreshControl, lisez ici .
la source
L'ajout du contrôle d'actualisation en tant que sous-vue crée un espace vide au-dessus des en-têtes de section.
Au lieu de cela, j'ai incorporé un UITableViewController dans mon UIViewController, puis j'ai changé mon
tableView
propriété pour pointer vers celle intégrée, et l'alto! Modifications minimales du code. :-)Pas:
@IBOutlet weak var tableView: UITableView!
par celui du UITableViewController nouvellement intégré, comme indiqué ci-dessousla source
Pour Swift 2.2.
Créez d'abord UIRefreshControl ().
Dans votre méthode viewDidLoad (), ajoutez:
Et faire une fonction de rafraîchissement
la source
Voici une autre solution qui est un peu différente.
J'ai dû l'utiliser à cause de certains problèmes de hiérarchie de vues que j'avais: je créais des fonctionnalités qui nécessitaient de passer des vues à différents endroits de la hiérarchie de vues, qui se cassaient lors de l'utilisation d'une tableview UITableViewController b / c la tableView est la vue racine de UITableViewController ( self.view) et pas seulement une vue régulière, elle a créé des hiérarchies contrôleur / vue incohérentes et a provoqué un plantage.
Fondamentalement, créez votre propre sous-classe de UITableViewController et redéfinissez loadView pour affecter self.view une autre vue, et redéfinissez la propriété tableView pour renvoyer une autre table.
par exemple:
Lorsqu'il est combiné avec la solution de Keller, cela sera plus robuste dans le sens où la tableView est maintenant une vue régulière, et non une vue racine de VC, et sera plus robuste contre les hiérarchies de vue changeantes. Exemple d'utilisation de cette façon:
Il existe une autre utilisation possible pour cela:
Étant donné que le sous-classement de cette façon sépare self.view de self.tableView, il est maintenant possible d'utiliser ce UITableViewController comme un contrôleur plus régulier et d'ajouter d'autres sous-vues à self.view sans les bizarreries d'ajouter des sous-vues à UITableView, donc on peut envisager de faire leur afficher les contrôleurs directement une sous-classe de UITableViewController au lieu d'avoir des enfants UITableViewController.
Quelques points à surveiller:
Étant donné que nous remplaçons la propriété tableView sans appeler super, il peut y avoir des choses à surveiller et à gérer si nécessaire. Par exemple, définir la table dans mon exemple ci-dessus n'ajoutera pas la table à self.view et ne définira pas le cadre que vous voudrez peut-être faire. De plus, dans cette implémentation, aucune tableView par défaut ne vous est donnée lorsque la classe est instanciée, ce que vous pouvez également envisager d'ajouter. Je ne l'inclus pas ici car c'est au cas par cas, et cette solution correspond en fait bien à la solution de Keller.
la source
Essaye ça,
Les solutions ci-dessus sont correctes mais tableView.refreshControl est disponible pour UITableViewController uniquement, jusqu'à iOS 9.x et est disponible dans UITableView à partir d'iOS 10.x.
Écrit dans Swift 3 -
la source
La première suggestion de Keller provoque un étrange bug dans iOS 7 où l'encart de la table est augmenté après la réapparition du contrôleur de vue. Passer à la deuxième réponse, en utilisant le uitableviewcontroller, a corrigé les choses pour moi.
la source
Il s'avère que vous pouvez utiliser les éléments suivants lorsque vous utilisez un UIViewController avec une sous-vue UITableView et conforme à UITableViewDataSource et UITableViewDelegate:
la source
self.refreshControl
est une propriété pour unUITableViewController
, pas unUIViewController
.