基于MVVM的iOS SwiftUI应用是否需要控制器?
SwiftUI中MVVM架构的控制器角色解析
在SwiftUI的MVVM架构中,不存在传统UIKit里的ViewController(控制器),但你看到的文章内容也没错——它大概率是针对UIKit+MVVM的场景写的,两者的差异源于UI框架本身的设计:
1. SwiftUI下的MVVM:无控制器的架构
SwiftUI是声明式UI框架,它本身就没有ViewController这个概念:
- View负责UI渲染、用户交互的触发(比如按钮点击、列表选择),并通过
@ObservedObject或@StateObject绑定ViewModel的数据; - ViewModel承担原MVC中控制器的业务逻辑、数据处理、状态管理职责,通过
@Published等属性向View传递状态更新; - 整个流程里没有中间的控制器,View和ViewModel直接完成数据绑定与交互。
举个简单的SwiftUI MVVM示例:
// ViewModel class TodoListViewModel: ObservableObject { @Published var todos: [String] = ["买牛奶", "写代码"] func addTodo(_ todo: String) { todos.append(todo) } } // View struct TodoListView: View { @StateObject private var viewModel = TodoListViewModel() @State private var newTodo = "" var body: some View { List { HStack { TextField("输入新待办", text: $newTodo) Button("添加") { viewModel.addTodo(newTodo) newTodo = "" } } ForEach(viewModel.todos, id: \.self) { todo in Text(todo) } } } }
这个例子里没有任何控制器,View直接和ViewModel交互,完全符合MVVM的设计。
2. UIKit下的MVVM:控制器依然存在,但职责被弱化
在UIKit框架中,ViewController是无法被完全移除的——它要负责管理View的生命周期(比如viewDidLoad、viewWillAppear)、导航跳转、响应系统事件(比如旋转、内存警告)等与UI框架强绑定的工作。但在MVVM架构下,控制器的职责会被大幅精简:
- 只做UI层的调度工作:比如把ViewModel的数据绑定到UI组件,把用户交互事件转发给ViewModel处理;
- 不再承担业务逻辑,所有的业务决策、数据处理都交给ViewModel。
总结
你之前的理解没错:在SwiftUI的MVVM里,确实没有传统控制器的位置;而那篇文章的内容针对的是UIKit场景,所以才会提到控制器的角色,两者并不冲突。
内容的提问来源于stack exchange,提问作者Timo Ernst
相关产品推荐
相关产品推荐

