2008-12-10 4 views
5

Lets sagen, ich habe eine Ansicht, myView, ein View-Controller, myViewController und eine Art von Modell-Objekt, myModel. Nehmen wir an, das Modell hat zwei KVO-konforme Eigenschaften: arrayOfPeopleNames und arrayOfAnimalKinds (beide NSS-Strings).MVC und Kakaobindungen Best Practices Frage

Aus meiner Sicht möchte ich zwei Pop-ups an den Inhalt dieser beiden Arrays gebunden haben.

Meine Frage ist, wenn MyController einen Verweis auf myModel hat, und das Dropdown-Menü an myViewController gebunden ist, ist es eine gute Übung, einen Schlüsselpfad in den Zeilen myModel.arrayOfPeopleNames zu setzen?

Oder muss ich ein zusätzliches NSArray in myViewController einrichten, das das in myModel spiegelt und stattdessen an diesen Schlüsselpfad bindet?

Das erste scheint aus einer Sicht der Implementierung viel einfacher zu sein (ich muss nicht die Controller-Array spiegeln das Modell-Array), aber ich frage mich, ob es das Modell zu viel zur Verfügung stellt.

Meinungen?

Antwort

8

Sie sollten das Array des Modells nicht im Controller spiegeln. Obwohl ich in einem sehr einfachen Fall nicht zu sehr daran interessiert wäre, direkt an das Array des Modells zu binden, könnten Sie Ihre UI-Objekte auch an einen NSArrayController binden, der das Array des Modells verwaltet. Dies würde eine Trennung zwischen dem Modell und der Benutzeroberfläche ermöglichen und, was noch wichtiger ist, Aufgaben wie Sortieren, Auswählen, Hinzufügen und Entfernen von Objekten usw. erledigen.

Ich kann sehen, woher Sie kommen, indem Sie betroffen sind KVO und Bindungen verletzt "reine" Modellansicht Controller-Design, aber es ist nicht etwas, worüber Sie sich sorgen sollten. Obwohl die KVO-Benachrichtigungen direkt vom Modell an die Ansicht übergeben werden, liegt es in der Verantwortung des Controllers, die Verbindung zwischen der Ansicht und dem Modell einzurichten und zu ändern (nur in diesem Fall erfolgt dies stattdessen über IB). Sie möchten beispielsweise nicht, dass ein Modellobjekt einen Verweis auf die Ansicht erhält, und sich selbst an die Benutzeroberfläche binden, für die der Controller zuständig wäre.

Als weiteres Beispiel für etwas, das Sie vermeiden sollten, sollten Sie überlegen, ob Ihr Modell stattdessen eine Reihe von "Tier-IDs" anstelle von Namen hätte. Anstatt eine Methode zu erstellen, um Tier-IDs in lesbare Tiernamen im Modell zu übersetzen, möchten Sie stattdessen möglicherweise einen Werttransformer oder einen Formatierer für die Konvertierung erstellen. Auf diese Weise können Sie dieses Maß an Trennung zwischen Modell und Ansicht beibehalten.

Bedenken Sie auch, dass der Zweck von Entwurfsmustern darin besteht, die Komplexität der Codierung einer Lösung für ein Problem zu reduzieren, niemals zu erhöhen. Sie werden sehen, dass dies genau die Art und Weise ist, wie Cocoa arbeitet, auch wenn es nicht immer der strengsten Definition eines Musters entspricht.

+0

Danke Marc, das macht sehr viel Sinn. Ich schätze all die Fragen, für die Sie mir in letzter Zeit Antworten gegeben haben :). –

+0

Ich bin froh, dass es geholfen hat! –