2009-05-12 9 views
1

Ich fragte mich, wie ich über eine Instanz einer Klasse gehen würde, sagen "Schiffsklasse" über mehrere Ansichten hinweg.Eine Instanz über mehrere Ansichten hinweg in Cocoa Touch

Sagen wir, ich habe einen rootViewController und drei Unteransichten, eine Main, eine Schlacht und eine Landung. Wo genau würde ich eine Instanz einer Klasse implementieren, die alle Informationen auf meinem Schiff speichert und über die anderen Ansichten darauf zugreift. Wenn mein Schiff noch über x-Raketen verfügt, wie kann eine andere Ansicht auf diese Informationen zugreifen, um sie anzuzeigen? Wenn ich es in der Hauptansicht implementiere, wie bekommt die Landing View diese Info?

Ich weiß, es muss eine einfache Möglichkeit, dies zu tun, und ich wette, es gibt eine Möglichkeit, die Sie tun sollten, ohne die Schiffsklasse in einer der Ansichten per se zu implementieren. Ich bin jedoch noch ziemlich neu in der Programmierung für das iPhone.

Vielen Dank im Voraus für jede Hilfe, die Sie alle bereitstellen können.

Antwort

3

Sobald Sie die einzelne Instanz Ihrer Ship-Klasse erstellt haben, müssen Sie anderen Ansichten mitteilen, um welche Instanz es sich handelt. So könnten Sie eine öffentliche Eigenschaft für die Klasse bereitstellen, die sie erstellt hat.

@property (nonatomic, retain) Ship* myShip; 

diese Klasse Angenommen, die AppDelegate - dann, in einer anderen Datei, Sie so etwas wie

[[[UIApplication sharedApplication] delegate].myShip getNumberOfMasts]; 

Das ist einfach schreiben würde, und arbeitet für ein einfaches Projekt, aber es macht die Das für jede Datei in Ihrem Projekt verfügbare Ship-Objekt wird zu globalen Daten, die in einem größeren Projekt schwer zu debuggen sind. (Wenn etwas mit myShip passiert, welches Objekt war dafür verantwortlich? Wenn es ein Objekt in Ihrer App sein könnte, dann ist es ein schwierigeres Problem zu debuggen als wenn der Zugriff auf die zwei Klassen beschränkt ist, die es brauchen.) Also, wenn Sie den Zugriff auf das Schiff beschränken möchten, dann mache myShip nicht zu einer öffentlichen Eigenschaft - stattdessen muss das Objekt, das myShip erstellt hat, es in Initialisierungsaufrufen übergeben, wenn es andere Objekte erstellt, die Zugriff benötigen. So etwas wie dies

[[myBattleController alloc] initWithShip:myShip]; 

Wenn dies wirklich ein und nur ein Schiff Objekt für die gesamte Anwendung, Suche auf Stack-Überlauf für die Beratung über Singleton Objekte zu schaffen.

+0

Wenn es mehr als ein Schiff ist, wäre auch ein Singleton-Objekt mit einer Reihe von Schiffen der richtige Weg. – tmadsen

1

Ihre Schiffsklasse ist das Modell in MVC (Model View Controller). Es wäre eine eigenständige Klasse. Ihre 3 Ansichten sind der Ansichtsteil von MVC. Alles was du vermisst, ist ein Controller. Der Controller erstellt Ihr Modell (z. B. Schiffsklasse) und Ihre Ansichten und enthält Referenzen zu all dem.

Controller ist der "Hub" Ihrer Anwendung. Es empfängt Benutzereingaben von Ansichten und führt Operationen an dem Modell aus und teilt dann Sichten mit, um die Anzeige zu aktualisieren.

Es gibt einige Ansätze, die Daten zur Ansicht zu übergeben. Zwei mögliche Optionen: Methoden zum Anzeigen hinzufügen, um Daten an sie zu übergeben (z. B. um Informationen zur Ansicht anzuzeigen). Die zweite Option, die hier möglicherweise anwendbar ist, besteht darin, dass für jede Ansicht der Verweis auf das Modell beibehalten wird - dies wird nur für den schreibgeschützten Zugriff verwendet. Z.B. Wenn Ihre Ansicht (en) erneut angezeigt werden müssen, erhalten sie die genauen Daten aus dem Modell (Schiffsklasse).

Werfen Sie einen Blick auf MVC Muster, es gibt viele Informationen darüber sogar in Apple-Dokumentation.

Verwandte Themen