Skip to content

12.3_创建ViewController作为View层

在MVVM架构中,ViewController扮演着View层的角色。你的ViewController主要负责展示数据和响应用户的交互。它不应该包含任何业务逻辑,而是将这些逻辑委托给ViewModel处理。让我们一起看看如何创建ViewController吧!🎉

ViewController 的基本结构

首先,你需要创建一个继承自UIViewController的类。这个类将负责管理你的视图和处理用户事件。确保你的ViewController尽可能地简洁,只关注UI相关的任务。

swift
import UIKit

class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // 在这里进行视图的初始化和布局
        setupUI()
    }

    func setupUI() {
        // 添加子视图,设置约束等
    }
}

使用纯代码构建UI

使用纯代码构建UI可以让你更好地控制视图的布局和样式。你可以使用UIViewUILabelUIButton等UIKit组件来创建你的界面。记住,使用Auto Layout来确保你的UI在不同的设备上都能正确显示。

swift
let myLabel: UILabel = {
    let label = UILabel()
    label.text = "Hello, MVVM!"
    label.textAlignment = .center
    label.translatesAutoresizingMaskIntoConstraints = false // 禁用自动约束
    return label
}()

添加视图并设置约束

setupUI()方法中,你需要将你的视图添加到ViewController的view中,并设置约束。使用NSLayoutConstraint或者更现代的SnapKit等库可以简化约束的设置。

swift
view.addSubview(myLabel)

NSLayoutConstraint.activate([
    myLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    myLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor)
])

处理用户交互

ViewController需要响应用户的交互,例如按钮点击。你可以通过addTarget方法将UI事件连接到ViewController中的方法。然后,将这些事件转发给ViewModel进行处理。

swift
let myButton: UIButton = {
    let button = UIButton()
    button.setTitle("点击我", for: .normal)
    button.backgroundColor = .blue
    button.setTitleColor(.white, for: .normal)
    button.translatesAutoresizingMaskIntoConstraints = false
    return button
}()

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .white
    setupUI()
    myButton.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
}

@objc func buttonTapped() {
    // 将事件转发给ViewModel
    print("Button tapped!")
}

避免在ViewController中处理业务逻辑

最重要的一点是,避免在ViewController中处理任何业务逻辑。ViewController应该只负责展示数据和响应用户交互。所有的数据处理和业务逻辑都应该放在ViewModel中。这样可以使你的代码更易于测试和维护。记住,ViewController是View层,ViewModel才是大脑!🧠

示例:简单的ViewController

下面是一个简单的ViewController示例,它显示一个标签和一个按钮。按钮点击后,会将事件转发到ViewModel。

swift
import UIKit

class MyViewController: UIViewController {

    let myLabel: UILabel = {
        let label = UILabel()
        label.text = "Hello, MVVM!"
        label.textAlignment = .center
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

    let myButton: UIButton = {
        let button = UIButton()
        button.setTitle("点击我", for: .normal)
        button.backgroundColor = .blue
        button.setTitleColor(.white, for: .normal)
        button.translatesAutoresizingMaskIntoConstraints = false
        return button
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        setupUI()
        myButton.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
    }

    func setupUI() {
        view.addSubview(myLabel)
        view.addSubview(myButton)

        NSLayoutConstraint.activate([
            myLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            myLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -50),

            myButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            myButton.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 50),
            myButton.widthAnchor.constraint(equalToConstant: 100),
            myButton.heightAnchor.constraint(equalToConstant: 40)
        ])
    }

    @objc func buttonTapped() {
        // 将事件转发给ViewModel
        print("Button tapped!")
    }
}

通过以上步骤,你就可以创建一个干净、简洁的ViewController,为你的MVVM架构打下坚实的基础。记住,保持ViewController的简洁和专注,将业务逻辑交给ViewModel处理,这样你的代码会更加清晰和易于维护。👍

本站使用 VitePress 制作