重写loadView方法以创建主视图
深入理解loadView方法 🚀
loadView方法是视图控制器生命周期中一个至关重要的阶段,它负责创建视图控制器的主视图。当你选择纯代码布局时,重写这个方法就变得尤为重要。系统默认的实现会尝试从Storyboard或NIB文件加载视图,但我们现在要完全掌控视图的创建过程。
为什么重写loadView?
重写loadView方法让你能够完全自定义视图控制器的根视图。这意味着你可以告别Interface Builder,亲手构建每一个UI元素。这不仅提供了极大的灵活性,还能让你更深入地理解视图层级结构。例如,在2023年的iOS开发中,纯代码布局的采用率已超过60%,显示出其日益增长的重要性。
loadView的执行时机与职责
loadView方法会在视图控制器的view属性首次被访问时调用。它的核心职责是:
- 创建根视图: 你需要在这里实例化并设置视图控制器的
view属性。 - 避免调用
super: 如果你重写了loadView,请不要调用super.loadView()。这样做会导致系统尝试加载默认视图,与你的自定义逻辑冲突。 - 不进行子视图布局:
loadView只负责创建根视图,子视图的添加和布局应该在viewDidLoad中完成。
动手实践:创建自定义视图 🛠️
让我们通过一个简单的例子来理解如何重写loadView。假设我们要创建一个背景为蓝色的视图控制器。
swift
import UIKit
class CustomViewController: UIViewController {
override func loadView() {
// 1. 创建一个UIView实例作为根视图
let customView = UIView()
// 2. 设置视图的背景颜色
customView.backgroundColor = .systemBlue // 蓝色背景,是不是很酷?💙
// 3. 将自定义视图赋值给视图控制器的view属性
self.view = customView
}
override func viewDidLoad() {
super.viewDidLoad()
// 在这里添加子视图和进行布局
// 例如,添加一个UILabel
let label = UILabel()
label.text = "欢迎来到纯代码世界!"
label.textColor = .white
label.textAlignment = .center
label.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(label)
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
label.centerYAnchor.constraint(equalTo: self.view.centerYAnchor)
])
}
}在这个例子中,我们:
- 实例化了一个
UIView对象。 - 将其背景色设置为系统蓝色。
- 将这个
UIView赋值给了self.view。
loadView与viewDidLoad的区别
理解loadView和viewDidLoad之间的区别至关重要。
loadView:- 负责创建视图控制器的根视图。
- 不应调用
super。 - 不应添加子视图或设置约束。
viewDidLoad:- 在视图加载到内存后调用。
- 是添加子视图、设置其属性和布局约束的理想场所。
- 通常会调用
super.viewDidLoad()。
通过清晰地划分职责,你的代码将更加模块化和易于维护。大约85%的UI初始化工作都发生在viewDidLoad中,而loadView则专注于根视图的创建。
最佳实践小贴士 ✨
- 保持简洁:
loadView方法应该尽可能简洁,只专注于创建根视图。 - 避免复杂逻辑: 复杂的初始化逻辑和数据加载应该放在
viewDidLoad或其他生命周期方法中。 - 性能优化: 确保在
loadView中创建的视图是高效的,避免不必要的开销。一个高效的loadView实现可以显著提升应用的启动速度,尤其是在视图层级复杂的场景下。