2010-12-06 20 views
0

Ich arbeite an einer Anwendung, die ein Singleton-Datenmodell und zwei Controller (eine MapView und die andere eine TableView) beide konfiguriert mit einem UITabBarController verwendet. Ich habe einen Delegaten in der mapView eingerichtet, um CLLocation-Daten zu erfassen und sie einem NSMutableArray im Datenmodell hinzuzufügen. Ich möchte diese Daten als Zellen zum TableView hinzufügen, ich habe Zugriff auf die Daten über das gemeinsame Modell, so dass dies kein Problem ist. Meine Frage ist:Automatisches/zeitgesteuertes Nachladen von tableView vom Modell?

(1) Gibt es eine Möglichkeit, das TableView automatisch zu aktualisieren, wenn neue Daten in das Modell (NSMutableArray) gehen?

EDIT:

Ich habe darüber nur nachgedacht und es scheint mir, wie soll ich das Modell als Delegierter für die CLLoctionManager verwenden, um die Daten in der NSMutableArray speichern, wie ich oben beschrieben. Auf diese Weise haben MapView und TableView Zugriff auf die Daten. Kann mir jemand helfen den TableView neu zu laden, gibt es einen automatischen/Timer-Weg, um das zu tun?

Antwort

2

Zunächst gibt es eine reloadData-Methode für eine UITableView, die Sie verwenden können, um das erneute Laden der Daten zu erzwingen.

Aber als Vorschlag, anstatt einen Timer zu verwenden, warum implementieren Sie nicht Ihr eigenes Protokoll/Delegate als Teil Ihrer Modellklasse. (Hier ist ein ziemlich gutes Tutorial auf using custom delegates in Objective-C, obwohl aus dem Gedächtnis ich denke, es lässt einen [someobject setDelegate: self]. Irgendwo auf dem Weg)

Sie könnten den View-Controller machen, die für die Tabelle anzuzeigen, einen Delegierten verantwortlich ist für Ihr Modell, das den View-Controller darüber informiert, dass sich die zugrunde liegenden Daten geändert haben und ein Reload erforderlich ist. Der View-Controller würde dann vermutlich den Benutzer informieren (Spinning-Wheel-o-Glück usw.) und reloadData nach Bedarf auf dem Tisch aufrufen.

+0

Sehr geschätzt, Sie beide beantwortet meine Frage und gab mir ein wenig zum Nachdenken, danke. – fuzzygoat

+0

@fuzzygoat - Froh, Hilfe zu sein. :-) –

3

Sie können dies tun, indem Sie Ihre Ansicht registrieren, die das TableView für Benachrichtigungen enthält.

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(yourSelector:) 
             name:@"addedData" 
             object:nil]; 

implementieren Sie dann Ihre Wähler:

- (void)yourSelector:(NSNotification *)notification { 
     [self.tableView reloadData]; 
    //do something 
} 

nun in der Klasse, wo die Daten hinzugefügt wird, Sie schreiben eine Benachrichtigung, dass neue Daten wurden hinzugefügt.

[[NSNotificationCenter defaultCenter] postNotificationName:@"addedData" 
             object:nil]; 
+0

+1 @sudo - Gibt es aus Interesse eine allgemeine Regel, wann eine Benachrichtigung statt eines Delegierten zu verwenden? (Angenommen, mehrere Objekte müssen wahrscheinlich informiert werden.) –

+1

Ja, ich glaube, Sie haben den Nagel getroffen. Sie können ein Objekt weiterleiten, wenn Sie Benachrichtigungen posten, aber wenn mehrere Objekte übergeben werden müssen, ist das wahrscheinlich nicht der beste Weg. Ich glaube jedoch, dass Sie mehrere Beobachter für die gleiche Benachrichtigung hinzufügen können. :) –

+0

Das ist sehr iteresting, ich könnte es nur in diesem Fall verwenden, aber da middaparka darauf hinweist, dass die Delegierten auch nützlich sind, habe ich sicherlich ein wenig mehr über ihre Verwendung gelesen. Sehr geschätzt Sudo – fuzzygoat

Verwandte Themen