Frage

Ich habe eine UIViewController - nennen wir es „FormController“ - was einfach eine Form ist, die ein Objekt bearbeitet. Ich will, es benutzen in 2 verschiedenen Situationen:

  1. ein neues Objekt anlegen -. Mit UINavigationController des presentModalViewController: Methode mit

  2. Editieren eines bestehenden Objektes -. Schieben View-Controller auf den UINavigationController Stapel, kein Dialogverfahren mit

Es gibt einen kleinen Unterschied, dass in der modalen Situation würde Ich mag eine Symbolleiste haben, mit „Abbrechen“ und „Fertig“, Tasten, während in der Stapel Situation würde Ich mag nur die Navigationsleiste durch die UINavigationController bereitgestellt habe.

Dies würde zu der Kontaktanwendung ähnlich sein, wo das „New Contact“ und „Kontakt bearbeitet“ Bildschirm scheinen die gleiche Ansicht Controller zu verwenden, aber das neue Kontaktformular präsentiert modal, während der Bearbeitungsbildschirm auf den Navigationsstapel geschoben wird .

Meine Frage ist: Was ist der beste Weg ist, um beiden Situationen zu handhaben, ohne dass 2 separate, schreiben, aber meist identischen Ansicht-Controller

?

Ich dachte über einen „ModalFormController“ zu schaffen, die den nackten „FormController“ durch Zusammensetzung verkapselt und eine Symbolleiste hinzufügt, aber ich habe irgendwo gelesen, in der Dokumentation, die Apple nicht Verschachtelung Ansicht-Controller empfehlen.

War es hilfreich?

Lösung

Was ich (manchmal) ein enum eingerichtet, der den Typ des View-Controllers angibt.

Zum Beispiel könnte man zwei Typen haben: ein Edit Typ und ein Add ( „neuen“) eingeben.

Der Add Typ ist über einen modalen View-Controller implementiert, während der Edit Typ auf einen vorhandenen Navigationsstapel geschoben wird.

In dem -viewDidLoad: Methode des View-Controller, habe ich einfach einen switch/case Baum tun, die den Titel und andere Aussehensmerkmale richten je nach Art Aufzählung oben angegeben.

Das Schöne daran ist, dass es einfach ist, einen neuen Typ hinzuzufügen. Der Nachteil ist, dass der bedingte Baum für diese Enumeration Gabe kann schnell bekommen kompliziert, je nachdem, wie unterschiedlich die Typen sind.

Aber der switch/case Baum macht es viel einfacher zu verwalten.

Also, es hängt davon ab, was Sie versuchen, mit den beiden Typen zu tun. Aber es ist auf jeden Fall machbar.

Andere Tipps

Warum nicht Subklassifizieren benutzen? Machen ModalCreateFormController eine Unterklasse von EditFormController und handhaben die modal-spezifische Dinge in der Unterklasse.

Darüber hinaus eine explizite Eigenschaft auf dem View-Controller mit (als Alex Reynolds schon sagt), zwei andere Ansätze, die mir einfallen, sind:

  1. Wenn Sie irgendeine Art von Modellobjekt, das Sie bearbeiten, bitten, es für seinen aktuellen Zustand. Wenn es jemals gespeichert worden sind, dann sind Sie im Bearbeitungsmodus. Ansonsten sind Sie erstellen in Modus.

  2. Schauen Sie sich den Wert der parentViewController Eigenschaft des Controllers. Wenn es eine Instanz von UINavigationController ist, dann sind Sie in dem Navigationsstapel. Wenn Sie modal angezeigt werden sind, wird es eine Instanz der Liste Controller sein.

Ug, ich zusätzliche ivars hassen ...

Ich benutze diese statt:

if([[self.navigationController viewControllers] objectAtIndex:0] == self){

        //Modal

    }else{

        //Pushed

    }

Es ist ein bisschen wie ein Hack, aber wir die Logik verwenden, dass, wenn der säumige View-Controller die erste in dem Stapel ist, man kann nicht mehr zurück. Eigentlich ignorieren wir die Tatsache, ob es modal überhaupt angezeigt wird.

Ich hatte dies ein paar Mal in meiner app zu tun, und nach ein paar verschiedenen Möglichkeiten, es zu tun, einschließlich modalen Subklassen & eine wiederverwendbaren modalen Hilfsklassen versuchen, die forwardInvocation verwendet. Ich fand das beste Muster eine containingModalViewController Methode jeweils View-Controller zu machen war, die (in der Regel) erstellt und gibt eine UINavigationController für den Anrufer mit PresentModalViewController zu verwenden.

In den meisten Fällen sind diese Methode baut und liefert einen UINavigationController mit Selbst als Root-View-Controller (mit wiederholten Aufrufen die Methode self.navigationController Überprüfung und die Rückkehr, dass statt, wenn es nicht Null ist). Andere Fälle habe ich eine Dummy-Root-Controller ersten und schob sich auf den zweiten, um eine Zurück-Taste zu bekommen. Dann kann ein Trick verwendet werden, um die Zurück-Taste drücken fangen: http: // smallduck .wordpress.com / 2010/10/05 / Abfangen-UINavigationController /

In einigen Fällen kann die Ansicht nicht eine Navigationsleiste braucht und so diese Methode stellt nur ein paar Flaggen und selbstzurückgibt. Ich habe sogar in einigen Fällen gefunden, dass eine Navigationsleiste brauchte es einfacher war, diese Methode self.view aufrufen zu machen, dann die Ansicht Hierarchie zwicken eine UINavigationBar hinzuzufügen und wieder selbst zurück. Aber in jedem Fall ist die Einrichtung häufig isoliert, dass eine Methode, und der Anrufer behandelt ihm das gleiche in jedem Fall.

von Apple erklärt, wie die Kontaktanwendung unter der Haube arbeitet:

  

Um eine benutzerdefinierte Ansicht Controller-Klasse zu ermöglichen, die setEditing:animated: Methode sowohl für Anzeige und Bearbeiten von Inhalten verwendet werden, außer Kraft setzen.

Sie erhalten einige Funktionen kostenlos, z.B. Edit/Done-Taste.

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