Frage

Ich habe eine Anwendung, die einen UITableView hat. Diese UITableView wird durch eine NSMutableArray bevölkerten (als Eigenschaft) gehalten wird, in der AppDelegate. Sie können als E-Mail-Fenster daran denken. Es listet Nachrichten in einer Unterklasse UITableViewCell. Wenn eine neue Meldung angezeigt wird, habe ich den gesamten Code getan, die die Nachricht herunterlädt, fügt die Daten an die NSMutableArray AppDelegate die, die alle Nachrichten halten. Dieser Code funktioniert gut.

Nun, wenn die neue Nachricht heruntergeladen und auf das Array hinzugefügt, Ich versuche, meine UITableView mit dem folgenden Code zu aktualisieren, aber - die UITableView der Stellvertretung Funktionen aufgerufen nicht bekommen.

Das Seltsame ist, wenn ich meine UITableView nach oben scrollen und nach unten, erhalten die Delegatmethoden schließlich genannt und meine Abschnittsüberschriften DO ändern (sie zeigen die Nachrichtenanzahl für diesen Abschnitt). Shoudn't sie in Echtzeit aktualisieren und nicht warten, meine Scrollen die Refresh ausgelöst? Auch die neue Zelle wird nie in dem Abschnitt hinzugefügt !!

Bitte um Hilfe !!

AppDelegate Code:

[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];
}

UITableViewController Code:

-(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
}
War es hilfreich?

Lösung

Als Plausibilitätsprüfung, haben Sie festgestellt, dass thetable an diesem Punkt nicht gleich Null ist?

Andere Tipps

Sie könnten versuchen, eine Verzögerung auf dem reload Anruf setzen - ich hatte ein ähnliches Problem, wenn ich versuche, meine Tableview zu bekommen zu aktualisieren, wenn Zellen Neuordnen, mit der Ausnahme, dass der App abgestürzt, wenn ich reload während es genannt

.

So etwas wie dies könnte sein, einen Versuch wert:

Refresh-Methode:

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

und nennen es dann mit (sagen wir) eine Verzögerung von 0,5 Sekunden:

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

Ich hoffe, es funktioniert ...

Wenn Sie reload aus einem versandt Methode aufrufen, stellen Sie sicher, dass es auf der Hauptwarteschlange auszuführen.

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];
    }); 
});

.. gleiche in Verfahren Form:

-(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];
        }); 
}

Haben Sie versucht, einen Haltepunkt in der Refresh-Methode Einstellung nur um sicher Ihre Nachrichten Array den richtigen Inhalt hat reload vor dem Aufruf?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top