MVC (Model-View-Controller) ist ein Architekturmuster, das eine Anwendung in drei Komponenten aufteilt: Model ist für Daten und Geschäftslogik verantwortlich, View für die Benutzeroberfläche, Controller für die Eingabeverarbeitung und Koordination von Model und View. In iOS wird MVC über UIViewController implementiert, in Android — über Activity und Fragment. MVC bleibt das grundlegende Muster, auf dem MVVM, MVP und Clean Architecture aufbauen. Erfahren Sie mehr auf MVC in Cocoa Core.
Wichtige Punkte
MVC (Model-View-Controller) ist ein Architekturmuster, das 1979 von Trygve Reenskaug für die Sprache Smalltalk-80 vorgeschlagen wurde. Das Muster teilt eine Anwendung in drei Schichten auf: Model enthält Daten und Geschäftslogik, View ist für die Anzeige zuständig, Controller verarbeitet Benutzereingaben und aktualisiert Model und View. Die Trennung der Verantwortlichkeiten ermöglicht es, jede Schicht unabhängig zu ändern — zum Beispiel View von UIKit zu SwiftUI zu wechseln, ohne die Geschäftslogik in Model zu ändern.
Komponenteninteraktion in MVC folgt einem Zyklus: Benutzer interagiert mit View → Controller empfängt das Ereignis → Controller aktualisiert Model → Model benachrichtigt Controller über Änderungen → Controller aktualisiert View. In der klassischen Implementierung verwendet Model das Observer-Muster: Wenn sich Daten ändern, sendet Model Benachrichtigungen, Controller abonniert und aktualisiert View. In Apples Implementierung übernehmen Key-Value Observing (KVO) oder NotificationCenter diese Rolle.
| Komponente | Verantwortung | Beispiel in iOS | Beispiel in Android |
|---|---|---|---|
| Model | Daten, Geschäftslogik, Netzwerk | Struct User, CoreData | Data class, Repository |
| View | UI-Anzeige | Storyboard, XIB, UIView | XML layout, Jetpack Compose |
| Controller | Eingabeverarbeitung, Koordination | UIViewController | Activity, Fragment |
MVC in der modernen mobilen Entwicklung wird weniger genutzt als vor 10 Jahren, bleibt aber zum Verständnis essenziell. Apple empfiehlt MVC für einfache Bildschirme in UIKit-Anwendungen. Google empfiehlt reines MVC nicht für Android — die offizielle Dokumentation schlägt MVVM mit Jetpack vor. Dennoch sind MVC-Kenntnisse für die Arbeit mit Legacy-Projekten und zum Verständnis der Evolution von Architekturmustern erforderlich.
Apple MVC ist eine benutzerdefinierte Implementierung des Patterns, die in UIKit integriert ist. UIViewController fungiert als Controller: verwaltet den Bildschirmlebenszyklus (viewDidLoad, viewWillAppear, viewDidDisappear), behandelt Berührungen und Benutzeraktionen, aktualisiert View über IBOutlets. View wird im Interface Builder (Storyboard oder XIB) oder programmatisch erstellt. Model — beliebige Datenobjekte: Netzwerkdienste, CoreData-Stacks, Swift-Strukturen.
final class UserViewController: UIViewController {
// View (über Storyboard Outlet)
@IBOutlet private var nameLabel: UILabel!
@IBOutlet private var emailLabel: UILabel!
// Model
private let userService = UserService()
override func viewDidLoad() {
super.viewDidLoad()
loadUser()
}
private func loadUser() {
userService.fetchUser { [weak self] user in
// Controller aktualisiert View
self?.nameLabel.text = user.name
self?.emailLabel.text = user.email
}
}
}
Das Problem von Apple MVC — View und Controller sind stark gekoppelt. UIViewController verwaltet gleichzeitig View und Logik. Storyboard speichert View in XML, aber der Controller hat direkte Referenzen auf UI-Elemente über IBOutlets. Dies verstößt gegen das Prinzip der einzigen Verantwortung: Der Controller ist für Lebenszyklus, Delegaten, Datenquelle, target-action und Animationen verantwortlich. Dadurch enthält ein Standard-iOS-App-Bildschirm 200–500 Zeilen im Controller.
ViewController-Lebenszyklus — Apple bietet 6 Lebenszyklusmethoden: loadView (manuelle View-Erstellung), viewDidLoad (nach dem Laden von View in den Speicher), viewWillAppear (vor dem Erscheinen auf dem Bildschirm), viewDidAppear (nach der Animation), viewWillDisappear (vor dem Verlassen des Bildschirms), viewDidDisappear (nach dem Verlassen). Jede Methode ist ein Ort für Logik in MVC. Die Verwendung dieser Methoden für Geschäftslogik beschleunigt das Wachstum des Controllers.
Android MVC — Activity und Fragment fungieren als Controller, XML-Layout-Dateien als View, jede POJO-Klasse mit Daten als Model. Activity verwaltet den Bildschirmlebenszyklus: onCreate, onStart, onResume, onPause, onStop, onDestroy. Fragment ist ein Unterbildschirm innerhalb von Activity mit eigenem Lebenszyklus. View (XML) ist von Controller getrennt und wird über setContentView oder LayoutInflater geladen. Model — Repositories, Datenbanken, Netzwerkaufrufe.
class UserActivity : AppCompatActivity() {
// View über XML Layout
private lateinit var binding: ActivityUserBinding
// Model
private val userRepository = UserRepository()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityUserBinding.inflate(layoutInflater)
setContentView(binding.root)
loadUser()
}
private fun loadUser() {
userRepository.getUser { user ->
runOnUiThread {
binding.nameText.text = user.name
binding.emailText.text = user.email
}
}
}
}
Android ViewBinding und DataBinding — moderne Werkzeuge, die die Kopplung zwischen Controller und View reduzieren. ViewBinding generiert eine Klasse mit direkten Referenzen auf Views aus XML und macht findViewById überflüssig. DataBinding fügt die Möglichkeit hinzu, Daten in XML-Markup über @{user.name} an die UI zu binden. DataBinding ist ein Schritt in Richtung MVVM, da es ermöglicht, Daten von Model zu View ohne Code in Activity zu übergeben. Google empfiehlt DataBinding für alle neuen Projekte.
Android-Lebenszyklus ist komplexer als iOS: Activity kann bei Bildschirmdrehung, Speichermangel oder Konfigurationsänderung zerstört und neu erstellt werden. In reinem MVC enthält der Controller (Activity) Logik, die bei Zerstörung verloren geht. Dies erfordert das Speichern des Zustands über onSaveInstanceState oder ViewModel von Jetpack, was über reines MVC hinausgeht und die Architektur MVVM näher bringt.
Massive View Controller ist ein Begriff, der das Hauptproblem von MVC in der mobilen Entwicklung beschreibt. Der Controller in iOS und Android übernimmt zu viele Verantwortlichkeiten: Eingabeverarbeitung, Datenvalidierung, Netzwerkinteraktion, Navigation, Caching, Animationen, Lebenszyklusverwaltung. Dadurch wächst der Controller auf 500–2000 Zeilen Code und wird schwer lesbar, testbar und wartbar.
Ursachen von Massive View Controller — die Architektur von UIKit und Android Framework fördert das Platzieren von Logik im Controller. Netzwerkaufrufe, JSON-Verarbeitung, Navigation — all das landet natürlicherweise in Activity oder UIViewController, weil sie Zugriff auf Lebenszyklus und UI haben. Der Entwickler muss bewusst Logik in separate Klassen (Service, Manager, Interactor) auslagern, was Disziplin und Verständnis von Architekturprinzipien erfordert.
| MVC-Problem | Beschreibung | Lösung |
|---|---|---|
| Starke Kopplung | Controller kennt View und Model | MVVM — ViewModel kennt View nicht |
| Testkomplexität | Controller hängt von UIKit/Android ab | Logik in Dienste auslagern |
| Lebenszyklus | Zustand geht bei Drehung verloren | ViewModel von Jetpack/SwiftUI |
| Fehlende Navigation | Controller verwaltet Übergänge | Coordinator-Muster, Router |
MVC testen — Model wird isoliert mit Unit-Tests getestet. Controller ist aufgrund der Abhängigkeit von UIKit/UIFoundation schwer zu testen. XCTest erlaubt nicht, UIViewController ohne ein View-Fenster zu erstellen. Für Android lösen ActivityTestRule und Robolectric das Problem teilweise, aber die Tests sind langsam. View wird normalerweise nicht mit Unit-Tests getestet — für UI werden Screenshot- und UI-Tests (XCUITest, Espresso) verwendet.
Wann MVC gerechtfertigt ist — einfache Bildschirme mit ein oder zwei Elementen (Login-Bildschirm, Profil, Einstellungen). Prototypen und MVP zur Hypothesenvalidierung — MVC ist ohne zusätzliche Schichten schneller zu schreiben. Projekte mit kleiner Codebasis von bis zu 10–15 Bildschirmen. In komplexen Projekten führt MVC zur Anhäufung technischer Schulden und erfordert alle 6–12 Monate eine Refaktorisierung.
MVC vs MVVM — der Hauptunterschied: in MVVM wird der Controller durch ViewModel ersetzt, das keine Referenz auf View hat. Daten werden über Observable (SwiftUI), LiveData/StateFlow (Android) oder Combine/RxSwift übergeben. ViewModel ist mit Unit-Tests ohne UI-Abhängigkeiten testbar. Apple empfiehlt MVVM mit SwiftUI seit 2019, Google — MVVM mit LiveData/Flow als offizielle Android-Architektur. MVVM erfordert mehr Code für die Bindung, verbessert aber die Testbarkeit erheblich.
MVC vs MVP — in MVP (Model-View-Presenter) ist Presenter eine testbare Schicht, die View über eine Schnittstelle erhält. Im Gegensatz zu MVC, wo Controller View direkt über UIKit verwaltet, ist Presenter nicht vom Framework abhängig — er arbeitet über die ViewInterface-Abstraktion. MVP war in der Android-Entwicklung vor Jetpack beliebt und wird in Legacy-Projekten verwendet. Presenter überlebt Activity und bewahrt den Zustand bei Bildschirmdrehung.
MVC vs Clean Architecture — Clean Architecture fügt Schichten hinzu: Use Cases (Interactors), Entities, Gateways und Repository. MVC bleibt in der Presentation-Schicht, aber die Geschäftslogik wird mit Use Cases in die Domain-Schicht verschoben. Clean Architecture löst das Massive-View-Controller-Problem radikal — der Controller enthält nur Use-Case-Aufrufe und View-Updates. Der Nachteil ist eine deutliche Zunahme der Klassen- und Dateianzahl, was bei Projekten mit 50+ Bildschirmen gerechtfertigt ist.
// MVC in iOS: Controller enthält alles
class OrderViewController: UIViewController {
func placeOrder() {
// Validierung + Netzwerk + UI-Aktualisierung
guard Validation.isValid(total) else { return }
NetworkService.shared.submit(order) { [weak self] result in
self?.handleResult(result)
}
}
}
// MVVM: Logik in ViewModel
class OrderViewModel: ObservableObject {
@Published var state: OrderState = .idle
func placeOrder() { /* Geschäftslogik */ }
}
Architekturwahl hängt von Teamgröße, Projektumfang und erforderlicher Testbarkeit ab. Für ein Team von 1–2 Entwicklern und ein Projekt mit bis zu 20 Bildschirmen eignet sich MVVM gut. Für ein großes Team von 5+ Entwicklern und ein Projekt mit 50+ Bildschirmen — Clean Architecture mit modularer Struktur. MVC bleibt relevant zum Verständnis der Architekturevolution, zur Wartung von Legacy-Projekten und für einfache UIKit-Bildschirme ohne komplexe Geschäftslogik.
Häufig gestellte Fragen
Das Hauptproblem ist der Massive View Controller. In iOS übernimmt UIViewController alles: Eingabeverarbeitung, View-Updates, Netzwerk, Navigation und Lebenszyklus. In Android übernimmt Activity/Fragment ähnliche Funktionen. Dadurch wächst der Controller auf Tausende von Codezeilen, wird schwer zu testen und zu warten und verletzt das Prinzip der einzigen Verantwortung.
In MVC aktualisiert der Controller direkt View und verarbeitet Benutzereingaben. In MVVM wird die Controller-Rolle von ViewModel übernommen, das keine Referenz auf View hat — Daten werden durch Bindungsmechanismen übergeben. MVVM ist einfacher zu testen, da ViewModel nicht von UIKit oder Android Framework abhängt. Apple empfiehlt MVVM mit SwiftUI, Google empfiehlt MVVM mit Jetpack Compose.
Ja, MVC bleibt ein funktionierendes Muster für einfache Bildschirme und Prototypen. Apple empfiehlt MVC für UIKit-Anwendungen mit einfachen Bildschirmen. Für komplexe Projekte mit vielen Bildschirmen, Netzwerkanfragen und Caching ist es besser, MVVM, VIPER oder Clean Architecture zu wählen. Anfängern wird empfohlen, MVC zu beherrschen, bevor sie komplexere Muster lernen.
Model wird isoliert getestet — das sind normale Datenobjekte und Geschäftslogik. Controller ist aufgrund der Abhängigkeit von UIKit oder Android Framework schwer zu testen. Es wird empfohlen, die Geschäftslogik aus dem Controller in separate Dienste oder Interactors auszulagern, die mit Unit-Tests getestet werden. View wird normalerweise nicht mit Unit-Tests getestet — dafür werden UI-Tests und Screenshot-Tests verwendet.
Auf iOS — MVVM mit SwiftUI und Combine, Apples Standard seit 2019. Auf Android — MVVM mit LiveData oder StateFlow, offiziell von Google empfohlen. Für große Projekte mit Teams von 5+ Entwicklern — Clean Architecture mit VIPER auf iOS oder Clean Architecture auf Android mit feature-basierter Modultrennung. Für Legacy-Projekte mit MVC — schrittweise Refaktorisierung mit Auslagerung der Logik in separate Dienste.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch