web-dev-qa-db-fra.com

UIRefreshControl au bas de UITableView iOS6?

Est-il possible d'ajouter UIRefreshControl au bas de la UITableView? Je voudrais l'utiliser pour charger plus de données. S'il vous plaît, suggérer?

25
Dany

Je crois qu'il n'y aura pas de solution simple à ce problème. Peut-être que quelqu'un pourrait écrire une bibliothèque distincte pour implémenter ce problème, ce qui entraînerait davantage de complications une fois que vous avez mis en cache les données dans la vue table.

Mais laissez-nous résoudre le problème et cela pourrait vous aider à réaliser ce que vous voulez. J'ai utilisé le code suivant pour ajouter plus de lignes dans l'application:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height;
    if (endScrolling >= scrollView.contentSize.height)
    {
        NSLog(@"Scroll End Called");
        [self fetchMoreEntries];
    }
}

Ou vous pourriez faire quelque chose comme ça:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height)
    {
        if (!self.isMoreData)
        {
            self.MoreData = YES;

            // call some method that handles more rows
        }
    }
}

Vous devez avoir vu de telles méthodes dans de nombreuses questions que j'ai décrites ci-dessus et certainement pas ce que vous avez demandé. Mais ce que vous pouvez faire, c'est que pendant que le code ci-dessus est en train de charger plus de données, vous pouvez ajouter une sous-vue et afficher quelques images similaires à celles proposées par UIRefreshControl. Ajoutez les images de la sous-vue à afficher en tant que progression jusqu'à ce que le code ci-dessus soit exécuté. Accueil cela aide.

En passant, je vous suggérerai de ne pas le faire car cela vous fera perdre votre temps à faire quelque chose d'aussi petit, à moins que vous ne le fassiez à des fins d'apprentissage. 

29
Jessica

Vous pouvez utiliser UIView pour personnaliser votre refreshControl en bas. Créez UIView et ajoutez-le à UITableView en tant que footerView.

UIView* footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];

[footerView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"refreshImage.png"]]];

tableView.tableFooterView = footerView;

Cachez-le: tableView.tableFooterView.hidden = YES;

Implémenter un délégué UIScrollView - 

(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height)
    {
             tableView.tableFooterView.hidden = NO;
            // call method to add data to tableView
    }

}

avant d'ajouter des données à tableView, enregistrez le décalage actuel de CGPoint offset = tableView.contentOffset;

appelez reloadData, puis réglez de nouveau le décalage précédemment enregistré sur tableView [tableView setContentOffset:offset animated:NO];

Pour que vous puissiez sentir de nouvelles données ajoutées au bas.

10
Rahul Mane

Je suis coincé sur le même problème récemment et écris une catégorie pour la classe UIScrollView. La voici CCBottomRefreshControl .

8
morbo

En réalité, la structure gratuite Sensible TableView fournit cette fonctionnalité prête à l'emploi. Vous spécifiez le numéro de lot et il récupérera automatiquement les données, en affichant la dernière cellule sous la forme d'une cellule "Charger plus". Une fois que vous avez cliqué sur cette cellule, le lot suivant sera automatiquement chargé, etc. Ça vaut le coup d'oeil.

4
Matt

La réponse suivante est dans Xcode 8 et Swift 3.

d'abord déclarer

var spinner = UIActivityIndicatorView()

que dans la méthode viewDidLoad, écrivez le code suivant:

spinner = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
spinner.stopAnimating()
spinner.hidesWhenStopped = true
spinner.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 60)
tableView.tableFooterView = spinner

maintenant enfin override la méthode déléguée scrollViewDidEndDragging avec les éléments suivants:

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        let offset = scrollView.contentOffset
        let bounds = scrollView.bounds
        let size = scrollView.contentSize
        let inset = scrollView.contentInset

        let y = offset.y + bounds.size.height - inset.bottom
        let h = size.height

        let reloadDistance = CGFloat(30.0)
        if y > h + reloadDistance {
            print("fetch more data")
            spinner.startAnimating()
        }
}

Pour UITableView, je suggère l'approche suivante:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{    
    // if this is the last row that we have in local data
    // and we didn't reach the total count of rows from the server side
    if (count == indexPath.row+1 && count < total)
    {
        // .. fetch more rows and reload table when data comes
    }
}

Je n'ai pas utilisé les méthodes de défilement à dessein, car la vue de défilement est lente. Il arrive que la vue défilement défile, que nous demandions plus de données, que nous actualisions plus de lignes et que la vue défilement ne soit pas encore terminée avec le défilement, elle ralentit toujours et pose des problèmes pour extraire davantage de données.

2
Prcela

Cette Swift library add pull pour actualiser au bas de UITableview.

https://github.com/marwendoukh/PullUpToRefresh-iOS

J'espère que cela vous aidera.

0
Marwen Doukh

Utilisez CCBottomRefreshControl dans les cocoapodes,

Comme pour l'objectif linguistique. vous pouvez ajouter le fichier pod à votre projet Swift puis l'exécuter, Je l'ai fait, aucun problème ne me concerne

J'espère que ça aide.

0
Abuzar Manzoor