7
votes

Paging PfqueryTableViewController automatiquement

Mon objectif est de configurer la pagination avec un PfqueryTableViewController . Je serais satisfait de l'une de ces solutions:

  • 1, pagination La vue de table automatiquement. Comme par exemple, si ObjectPerpage = 10 Le TableView charge les 10 objets suivants lorsque la ligne actuelle est la 10. Rangée et ainsi de suite.

  • 2, pagination avec une "charge plus de cellule" utableviewcell . Comme je le vois, c'est la solution populaire, alors j'aimerais aussi cette variation.

    En fait, je ne reçois aucune erreur lorsque j'essaie la deuxième solution, cela ne fonctionne tout simplement pas. J'ai ajouté une nouvelle cellule sur le storyboard et j'ai créé une classe pour elle et vérifié les codes correspondants et autres codes correspondants comme point de départ. Comme je le vois, je devrais afficher la cellule loadmorecell lorsque le nombre des lignes est inférieur à celui des objets .Count . J'ai essayé de plusieurs manières, mais rien ne fonctionne, je ne peux pas afficher le chargement de toute façon.

    Voici mon essai: xxx

    L'autre partie de mon implémentation est la dernière partie de la question de la question.

    Ma question originale couvre mes tentatives avec la première variation (paging automatiquement).

    ma question originale:

    J'ai un PfqueryTableViewController , mais je ne peux pas configurer la pagination pour cela. Mon plan est simple, je souhaite charger la page suivante lorsque l'utilisateur est défilé vers le bas de la vue Table. Si la table affiche 10 éléments / page, je voudrais afficher l'élément suivant lorsque la cellule 10. est apparue.

    En réalité, je détecte lorsque l'utilisateur atteint le bas de la table, puis appelez [auto libernextpage] pour les nouveaux éléments, mais l'application se bloque avec cette erreur:

    application de terminaison en raison d'une exception non capturée 'NsinternalconsiscyException', raison: "Tentative de supprimer la rangée 10 de la section 0 qui contient seulement 10 lignes avant la mise à jour '

    Je ne comprends pas vraiment ce problème, car la source de données (une matrice) a plus de 40 objets pouvant être chargés.

    Voici comment gérer l'appel de la méthode (la pagination est activée à initwithcoder ) xxx

    et voici la configuration de la vue de la table xxx


6 commentaires

@Yan je ne suis pas sûr que cela se bloque à [auto liberiePage] , car j'ai un nslog dans le requête qui apparaît dans le journal après le nslog (@ "charger plus de lignes"); . Donc, je pense que le interrogeable est appelé. Non, il n'y a pas d'option pour supprimer des lignes. Cela fonctionne si je le commente.


Seriez-vous capable de poster plus de code? Peut-être de la perchangeable pour déboguer plus loin et - (Nsinteger) TableView: (Uitailview *) TableView NumberViewSection: (Nsinteger) Section


@Yan j'ai édité ma question.


Tout va bien. Avec ce code, vous voyez tous les objets de la tableView et non 10? Si vous commencez [auto libernextPageIntable]; Et ça ne fait pas crash que tu vois la pagination?


Lorsque vous chargez la table, ne voyez-vous que 10 objets ou toutes vos données?


Faites-moi savoir si vous voulez basculer pour discuter


4 Réponses :


3
votes

Voici le code qui fonctionne dans mon projet de test. Je reçois l'erreur que vous obtenez lorsque numérosofrowsection code> n'est pas commenté. Je vois que la charge plus de cellule, mais elle charge automatiquement le reste des cellules, faites-le moi savoir si cela aide

#import "ParseDataTableViewController.h"

@implementation ParseDataTableViewController


- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Custom the table

        // The className to query on
        //self.parseClassName = @"ParseTest";

        // The key of the PFObject to display in the label of the default cell style

        // The title for this table in the Navigation Controller.
        self.title = @"Test";

        // Whether the built-in pull-to-refresh is enabled
        self.pullToRefreshEnabled = YES;

        // Whether the built-in pagination is enabled
        self.paginationEnabled = YES;

        // The number of objects to show per page
        self.objectsPerPage = 15;
    }
    return self;
}




- (IBAction)nextPage:(id)sender
{
    [self loadNextPageInTable];
}

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView {
    CGPoint offset = aScrollView.contentOffset;
    CGRect bounds = aScrollView.bounds;
    CGSize size = aScrollView.contentSize;
    UIEdgeInsets inset = aScrollView.contentInset;
    float y = offset.y + bounds.size.height - inset.bottom;
    float h = size.height;
    float reload_distance = 15;
    if(y > h + reload_distance) {
        NSLog(@"load more rows");
        [self loadNextPageInTable];
    }
}

-(void) loadNextPageInTable {

    [self loadNextPage];
    NSLog(@"NEW PAGE LOADED");
}


- (PFQuery *)queryForTable {


    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Name BEGINSWITH 't'"];
    PFQuery *followQuery = [PFQuery queryWithClassName:@"ParseTest" predicate:predicate];


    return followQuery;

}

/*-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return self.objects.count;
}*/



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object {


    static NSString *CellIdentifier = @"DataCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    cell.textLabel.text = object[@"Name"];

    return cell;

}



@end


35 commentaires

Malheureusement, cela ne fonctionne pas, j'ai la même erreur. Je pense que la requête charge tous les résultats, si vous ne définissez pas de limite et, dans ce cas, je n'ai pas limité le nombre de résultats. Peut-être que le problème est que les cellules ne peuvent pas charger les 25 objets suivants. Vous n'avez pas d'idée.


Et si vous ajoutez auto.paginationEnabled = Oui; qui est par défaut et commentez l'ensemble - (vide) ScrollViefDidscroll: (Uiscrollview *) ASCROLLView méthode pour voir si vous obtenez la pagination par défaut


N'aide pas. Rien ne se passe, si j'appelle aussi le LoadNextPage, je reçois la même erreur.


Voyez-vous toutes vos données ou seulement 10 objets? Aussi voyez-vous une ligne indique la page suivante ou quelque chose


Je vois tout non seulement la valeur par page.


Pouvez-vous mettre à jour la question avec le code que vous avez maintenant avec la limite définie. Essayez de définir Self.ObjectsPerpage = 7; et voir si l'erreur est différente


J'ai mis à jour mes questions, il contient mes nouvelles tentatives. Malheureusement, définir les objets à 10 n'a pas aidé.


Je l'ai essayé plus tôt avec +1 rangée, obtenez cette erreur 'nsrangeeexception', raison: '*** - [__ NSARRAYM ObjectAindex:]: Index 0 au-delà des limites pour une matrice vide' .


La question est de voir toutes vos données ou seulement 10 rangées. changer le Self.ObjectSperPage = 3; et retourne self.Object.Count + 1; et voyez ce qui se passe


Je pense que quelque chose est désactivé la pagination et que vous voyez toutes les lignes.


Également en interminable, vous avez PfQuery * FUNQUERY = .... Et puis vous retournez la requête est si correcte?


Oui, la requête et tout le reste fonctionne parfaitement. Je peux tout afficher sauf les pages suivantes


Mais dans la tableView voyez-vous tous les résultats ou seulement 10? Est-ce que self.objectsperpage = 10; travail?


Non :(. Il suffit de trouver ceci aujourd'hui lien < / a> Il semble prometteur, mais n'a pas eu le temps de l'essayer aujourd'hui.


Laissez-moi savoir si vous avez toujours des problèmes. J'ai créé un projet d'analyse qui fonctionne, je publierais le code si nécessaire.


Pour quelle version? Je me batte avec le second, mais je ne peux pas comprendre. Je ne peux pas afficher la charge plus de cellule de toute façon.


J'étais en fait capable de reproduire votre erreur. Commentez le numérosofrowsection et voyez si vous obtenez l'erreur.


J'ai mis à jour ma réponse que je viens de tester avec parse et cela a fonctionné. Je ne sais pas exactement pourquoi avoir le numéro d'analyse du programme. Pourrait être quelque chose avec le nombre de lignes et charger plus de cellules.


L'ibaction fait quelque chose?


Désolé, oubliez l'ibaction. Je ne faisais que tester le LoadNextPage si vous appuyez sur un bouton et non avec le code.


Je pense que la clé de l'erreur est que le nombre de lignes d'erreur ne doit pas être surchargé. D'une manière ou d'une autre, cela bloque l'application avec votre erreur. Vous devez créer une charge personnalisée plus de cellule si nécessaire


Vous pouvez retourner une vente personnalisée avec juste un indicateur d'activité jusqu'à la charge de données.


Yan, merci beaucoup, j'apprécie vraiment votre aide. Il semble que cela fonctionne. Juste une autre question, ce n'est pas un problème, que je n'utilise plus le numérosofrowsectionSection? Cela ne peut pas conduire à un mauvais comportement ni à aucun crash? Qu'en penses-tu?


Je ne pense pas qu'il devrait y avoir un problème. PfqueryTableViewController implémente-le sinon cela ne fonctionnerait pas. Il retournera le nombre correct d'objets.


Une telle solution léger incroyable. Je ne pouvais pas faire crash alors je pense que cela fonctionnera. Avez-vous vécu quelque chose dans votre démo que je devrais m'occuper de?


J'ai utilisé une telle solution dans mon application et j'ai eu des problèmes avec Parse. J'essayais simplement de comprendre pourquoi la présence d'un numéro d'information est une question, mais je ne pouvais pas. Il vous suffit de travailler avec la charge plus de cellule si vous souhaitez le laisser par défaut ou le personnaliser. La seule chose que je peux penser.


Check Out - (PFTABLIVIEWCELL *) TATEVIEW: (UitaireView *) TableView CellfornextpageAtIndExpath: (NsindexPath *) Industrie Pour personnaliser la cellule parse.com/docs/ios/api/classes/pfqueryTableViewController.ht ml # / ... :


C'est pour la cellule de chargement? En fait, il a juste une étiquette "chargée plus" sur un BG blanc. J'ai essayé de modifier sa couleur dans IB, mais rien ne s'est passé.


Utilisez cette méthode et renvoyez votre charge personnalisée plus de cellule. Laissez-moi savoir si cela ne fonctionne pas, je posterai le code un peu plus tard


Va essayer. Merci encore!!


Sûr. Joyeux codage! :)


Je viens de découvrir un petit bogue, lorsque je revenais à la table VC de la table d'un autre VC, la vue de la table saute à l'objet 10. Peu importe si c'était sur la page 2. ou 4. Page. Avez-vous une idée de comment puis-je éviter cela?


J'ai vérifié l'application où j'utilise cette solution et je ne reviendra pas. Assurez-vous de ne pas recharger la table lorsque vous revenez. Quelque part dans la vieillewillappear ou quelque chose. Fais-moi savoir


Vous avez raison. J'ai rechargé la table dans la viewwillappear, supprimé et fonctionne, mais cela propose un autre problème. Je l'ai rechargée là-bas parce que je voudrais charger les nouveaux objets chaque fois que la VC est ouverte à partir d'une barre d'onglets. Pensez-vous que la mise en œuvre d'une instruction IF dans la viewwillappear pourrait être une solution de travail - qui ne laisse pas à recharger la table lorsque nous naviguons avec SEGUE -.


Je ne sais pas si vous pouvez différencier dans la viewwillappear si vous revenez de Segue ou en cliquant sur la barre d'onglets. Je ne sais rien de l'application sur laquelle vous travaillez, mais je ne suis pas sûr en ce qui concerne la rechargement de la convivialité à chaque fois que vous cliquez sur la barre d'onglets. Que se passe-t-il si un problème de défilement utilisateur et quelques pages changent d'onglets, puis il rechargera. Je suppose qu'il devrait y avoir la mise en œuvre.



0
votes

J'ai créé une application de démonstration de la première solution. Vous avez ici Demo . Je n'ai pas utilisé PfqueryTableViewController (juste uikit) mais je pense qu'il n'y aura aucun problème avec cela. Dans cette démo, toutes les données sont générées localement et simuler le temps de téléchargement, j'ai été ajouté une minuterie avec un intervalle 5S.

l'erreur:

Application de terminaison en raison d'une exception non capturée 'NsinternalInconsiscyException', raison: "Tentative de suppression de la ligne 10 de la section 0 qui contient seulement 10 lignes avant la mise à jour"

signifie que vous essayez d'éliminer l'élément avec indéniPath.row = 10, mais il n'y a pas d'élément sur cette position. Les lignes sont comptées de 0 SO 10'TH (dans ce cas le dernier) élément ont indéniché.row = 9.

J'espère que cela vous aidera.


0 commentaires

0
votes

Je ne connais pas PfqueryTableViewController, mais voici une solution de travail adaptée de l'un de mes projets précédents: xxx


0 commentaires

1
votes

Dans votre création de cellules, vous n'avez aucun moyen de créer une nouvelle cellule si on n'existe pas déjà.

Créer une nouvelle cellule quand on n'existe pas du mécanisme de déséquilibre: < Pré> xxx


0 commentaires