Question

J'ai une application qui a une UITableView. Cette UITableView est remplie par un NSMutableArray détenu (en tant que propriété) dans le appDelegate. Vous pouvez considérer cela comme une fenêtre de courrier électronique. Il répertorie les messages dans une UITableViewCell de sous-classe. Quand un nouveau message apparaît, j'ai tout le code terminé qui télécharge le message, ajoute les données au NSMutableArray de l'appDelegate qui contient tous les messages. Ce code fonctionne bien.

Maintenant, une fois le nouveau message téléchargé et ajouté au tableau, j'essaie de mettre à jour mon UITableView à l'aide du code suivant. Toutefois, les fonctions de délégué de UITableView ne sont pas appelées.

Ce qui est étrange, c’est que lorsque je fais défiler mon UITableView vers le haut, les méthodes de délégation sont finalement appelées et les en-têtes de section changent (ils affichent le nombre de messages pour cette section). Ne devraient-ils pas se mettre à jour en temps réel et ne pas attendre que mon défilement déclenche l'actualisation? De plus, la nouvelle cellule n’est jamais ajoutée dans la section !!

S'il vous plaît, aidez-nous!

CODE APPDELEGATE:

[self refreshMessagesDisplay]; //This is a call placed in the msg download method

-(void)refreshMessagesDisplay{
    [self performSelectorOnMainThread:@selector(performMessageDisplay) withObject:nil waitUntilDone:NO];
}

-(void)performMessageDisplay{
    [myMessagesView refresh];
}

Code UITableViewController:

-(void) refresh{
    iPhone_PNPAppDelegate *mainDelegate = (iPhone_PNPAppDelegate *)[[UIApplication sharedApplication] delegate];

    //self.messages is copied from appDelegate to get (old and) new messages.
    self.messages=mainDelegate.messages;

    //Some array manipulation takes place here.

    [theTable reloadData];
    [theTable setNeedsLayout];  //added out of desperation
    [theTable setNeedsDisplay];  //added out of desperation
}
Était-ce utile?

La solution

En guise de vérification de l'intégrité, avez-vous vérifié que la table n'est pas nulle à ce stade?

Autres conseils

Vous pouvez essayer de retarder l'appel reloadData. J'avais un problème similaire lorsque j'essayais de mettre mon tableau à jour lors de la réorganisation des cellules, sauf que l'application se bloquait si je l'appelais reloadData.

Donc, quelque chose comme ceci pourrait valoir la peine d'essayer:

Méthode d'actualisation:

    - (void)refreshDisplay:(UITableView *)tableView {
    [tableView reloadData]; 
}

puis appelez-le avec (par exemple) un délai de 0,5 seconde:

[self performSelector:(@selector(refreshDisplay:)) withObject:(tableView) afterDelay:0.5];

J'espère que ça marche ...

Si vous appelez reloadData depuis une méthode répartie, veillez à l'exécuter dans la file d'attente principale.

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) {

    // hard work/updating here

    // when finished ...
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        [self.myTableView reloadData];
    }); 
});

.. même sous forme de méthode:

-(void)updateDataInBackground {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0), ^(void) {

        // hard work/updating here

        // when finished ...
        [self reloadTable];
    });
}

-(void)reloadTable {
       dispatch_async(dispatch_get_main_queue(), ^(void) {
            [myTableView reloadData];
        }); 
}

Avez-vous essayé de définir un point d'arrêt dans votre méthode d'actualisation pour vous assurer que le tableau de messages contient le contenu correct avant d'appeler reloadData?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top