W paradygmacie MVC model powinien być oddzielony od widoku. Aby uzyskać dane, które musi narysować, prosi o to Kontrolera, który z kolei prosi Model o to. W ten sposób odejmujemy informacje od GUI. Pomyśl o tym jako o widoku kontrolera modelu, jeśli to pomaga. Dlatego w większości przypadków kontroler "jest właścicielem" modelu.
Na przykład w cs193p, CalculatorViewController
(kontroler) ma właściwość CalculatorBrain
(model), z którą wchodzi w interakcję, aby uzyskać wyniki równań do wyświetlenia w widoku.
W danym przykładzie SolarSystemViewController
prawdopodobnie mają silne odniesienie do SolarSystem
, co byłoby ankietę dla danych, które byłoby rękę z The SolarSystemView
tak, że może zwrócić się, gdy wymagał odnowienia. SolarSystemView
może również powiadomić SolarSystemViewController
, gdy użytkownik wejdzie z nim w interakcję, aby mógł wyświetlać inne widoki lub aktualizować SolarSystem
wśród innych zadań, które może wykonać.
Należy zauważyć, że paradygmat MVC w Cocoa i Cocoa Touch jest nieco inny niż bardziej uogólniona wersja MVC, którą można zobaczyć, np. Smalltalk. Na przykład, jeśli spojrzysz na Wikipedia page on MVC, diagram powinien wyglądać inaczej niż to, czego się uczyłeś. W rzeczywistości GoF (Wzorce projektowe) opisuje w ten sposób MVC.
MVC składa się z trzech rodzajów obiektów. Model jest obiektem aplikacji, widok jest jego ekranem, a kontroler definiuje sposób, w jaki interfejs użytkownika reaguje na dane wprowadzone przez użytkownika. Przed projektami interfejsu użytkownika MVC, miały tendencję do scalania tych obiektów razem. MVC oddziela je, aby zwiększyć elastyczność i użyć ponownie. MVC oddziela widoki i modele poprzez ustanowienie między nimi protokołu subskrypcji/powiadamiania. Widok musi zapewniać, że jego wygląd odzwierciedla stan modelu. Kiedy zmieniają się dane modelu, model powiadamia o widokach, które zależą od niego. W odpowiedzi każdy widok otrzymuje możliwość aktualizacji samego siebie. To podejście umożliwia dołączanie wielu widoków do modelu, aby uzyskać różne prezentacje. Możesz również utworzyć nowe widoki modelu bez przepisywania go.
W obu tych przypadkach sam model kontaktuje się z widokiem, aby go zaktualizować. Jednak w systemie iOS interakcja między modelem a widokiem jest obsługiwana przez kontroler. Jest to dobrze wyjaśnione w first session of cs193p, a także Apple's own documentation on MVC relationships.. W ten sposób wystarczy przepisać kod kontrolera, aby ponownie użyć modeli i widoków w innym miejscu.
Oto schemat MVC z cs193p, aby wyjaśnić.
To pokrywa całkowicie to, o co prosiłem; Mam jedno dodatkowe zapytanie. Co powinien zrobić "tick" -ing? Musiałby oczywiście być kleszczem, aby planety mogły się poruszać. Jeśli rozumiem poprawnie, to kontroler będzie właścicielem zegara, w którym to momencie będzie wymagał zmiany modelu, a następnie pobierania danych z modelu i wyświetlania go na ekranie, prawda? Może to być satysfakcjonujące dla osobnego pytania. –
@CarterPape Tak, to brzmi dla mnie poprawnie. Kontroler zwykle obsługuje aktualizacje modelu, a następnie powiadamia o widokach, które wymagają aktualizacji. Na przykład, pętla uruchamiania gry istniałaby w kontrolerze, a każda klatka powiadomiłaby agentów w grze (model), aby aktualizowali się przed powiadomieniem o widoku (takim jak GLKView), aby zaktualizować się. – Metabble