Ответ
loadView() — правильное место для кастомной инициализации view контроллера.
Пример реализации:
class CustomViewController: UIViewController {
override func loadView() {
// Создаем кастомную view
let customView = CustomView()
customView.backgroundColor = .systemBackground
customView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
// Устанавливаем как основную view контроллера
self.view = customView
}
}
Важные нюансы:
- Не вызывайте
super.loadView()если полностью заменяете view:// Правильно: override func loadView() { self.view = CustomView() }
// Неправильно: override func loadView() { super.loadView() // Создает стандартную UIView self.view = CustomView() // Лишняя работа }
2. **Проверка после установки:**
```swift
override func loadView() {
let customView = CustomView()
self.view = customView
assert(self.view != nil, "View must not be nil after loadView")
}
-
Когда НЕ переопределять
loadView():- Для контроллеров из Storyboard/XIB
- Когда используется
init(nibName:bundle:)с существующим nib-файлом
-
Альтернативный подход — установка в
viewDidLoad()(менее предпочтительно):// Работает, но view уже создана системой override func viewDidLoad() { super.viewDidLoad() let customView = CustomView(frame: self.view.bounds) self.view = customView // Замена существующей view }
Порядок вызова методов:
init()→ 2.loadView()→ 3.viewDidLoad()→ 4.viewWillAppear()
Ответ 18+ 🔞
Давай разберем эту тему про loadView(), а то тут, блядь, столько народу наступает на одни и те же грабли, что хоть саперов обучай.
Вот смотри, loadView() — это как раз тот самый момент, когда контроллеру нужно родить себе вьюху. Не раньше, не позже. Система ему говорит: «Слушай, дружок, пора бы уже обзавестись своим view-проперти, а то оно пока nil». И вот тут ты можешь впендюрить свою кастомную вьюху, а не ту стандартную серую херню, которую система по умолчанию подсовывает.
Вот как это выглядит в коде, если ты не лох:
class CustomViewController: UIViewController {
override func loadView() {
// Создаем кастомную view
let customView = CustomView()
customView.backgroundColor = .systemBackground
customView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
// Устанавливаем как основную view контроллера
self.view = customView
}
}
А теперь, блядь, внимание, важные моменты, где все обычно ебутся:
-
Не вызывай
super.loadView()как попугай, если сам всё делаешь. Это же не ритуал какой-то, ёпта!// Правильно — ты сам себе хозяин: override func loadView() { self.view = CustomView() } // Неправильно — зачем зря систему дергать, она тебе лишнюю вьюху создаст: override func loadView() { super.loadView() // А система тут уже наваяла UIView() self.view = CustomView() // А ты её выкидываешь! Зачем?! } -
Проверь, не обосрался ли ты случайно и вьюха всё-таки проставилась. Мало ли.
override func loadView() { let customView = CustomView() self.view = customView assert(self.view != nil, "View must not be nil after loadView") // На всякий пожарный } -
А когда НЕ надо лезть в
loadView()? Да когда и так всё готово, ядрёна вошь!- Если контроллер из Storyboard или XIB — там всё само подцепится.
- Если ты используешь
init(nibName:bundle:)и у тебя есть этот самый nib-файл. Система сама всё загрузит.
-
Альтернатива для ленивых (или для тех, кто поздно спохватился) — сделать всё в
viewDidLoad(). Но это, блядь, как приехать на стройку, когда фундамент уже залили, и пытаться его поменять. Работает, но криво.// Работает, но view уже создана системой (та самая серая херня) override func viewDidLoad() { super.viewDidLoad() let customView = CustomView(frame: self.view.bounds) self.view = customView // Замена существующей view — лишняя работа! }
И запомни раз и навсегда порядок, чтобы не путаться, как мартышлюшка:
init()— родился контроллер.loadView()— ВОТ ТУТ он должен создать себе вьюху. Идеальное место для кастомной.viewDidLoad()— вьюха создана, можно её настраивать (цвета, кнопки, лейблы).viewWillAppear()— скоро покажемся на экране.
Вот и вся магия. Главное — не выебывайся и делай в нужном месте.