Один из самых популярных вопросов на собеседовании

Это один из самых популярных вопросов на собеседовании на должность стажера/младшего разработчика iOS. И эта тема действительно важна, потому что каждый iOS-разработчик должен знать жизненный цикл контроллера представления, чтобы он мог легко реагировать на изменения представления и выполнять действия в нужном месте.

Мы можем разделить все методы жизненного цикла на 3 группы, и они отвечают за:

  • Создание контроллера представления
    — init()
  • Управление представлением
    -
    loadView()
    -
    viewDidLoad()
  • Ответ на события, связанные с просмотром
     –
    viewWillAppear(_:)
     –
    viewDidAppear(_:)
     –
    viewWillDisappear(_:)
    -
    viewDidDisappear(_:)

Рассмотрим подробнее каждый метод.

в этом()

Как и любой другой класс, UIViewController имеет init() метод. На этапе инициализации представление контроллера не загружено, поэтому вы не можете получить доступ к нему, его свойствам или методам. Вы можете создать собственный init(), если хотите передать некоторые данные или зависимости контроллеру представления.

loadView()

Этот метод создает представление, которым управляет контроллер. Вы можете переопределить этот метод, чтобы установить собственное представление в качестве представления контроллера.

override func loadView() {
  super.loadView()
  self.view = CustomView()
}

Если вы используете Interface Builder для создания ваших представлений и инициализации контроллера представления, вы не должны переопределять этот метод. Если loadView() не был переопределен и у контроллера представления нет связанного файла пера, этот метод вместо этого создает простой объект UIView. Этот метод вызывается только один раз.

просмотрDidLoad()

Этот метод вызывается, когда представление контроллера загружено в память. Вы можете выполнить некоторые дополнительные настройки в этом методе. Поскольку представление загружается на этом этапе, вы можете получить доступ к представлению контроллера и его свойствам. Как loadView(), viewDidLoad() вызывается только один раз. В этом методе вам нужно настроить представления, добавить действия для UIControl элементов, предоставить делегаты для таблиц, коллекций и других элементов, которым нужны делегаты. Вы также можете получить некоторые данные из API, но только если вы уверены, что вам нужно сделать это один раз. В противном случае сделайте это в файле viewWillAppear(). Другими словами, вы можете настроить начальное состояние контроллера представления и представления в этом методе.

override func viewDidLoad() {
  super.viewDidLoad()
  fetchSomeData()
  tableView.delegate = self
  tableView.dataSource = self
  label.text = "Some text"
  submitButton.addTarget(self, action: #selector(someSelector), for: .primaryActionTriggered)
}

Кроме того, не рассчитывайте никакие кадры в viewDidLoad(). На данном этапе экран не загружается, поэтому его границы могут быть неверными.

viewWillAppear(_:)

Это вызывается непосредственно перед добавлением контроллера представления в иерархию представлений и его отображением пользователю. Я обычно использую этот метод для настройки панели навигации и получения данных, если я хочу обновить некоторые данные. В этом методе устанавливаются все рамки просмотра, поэтому можно выполнить некоторые расчеты компоновки. Но не запускайте здесь никаких анимаций! Вид еще не отображается.

override func viewWillAppear(_ animated: Bool) {
  super.viewWillAppear(animated)
  title = "Some title"
  navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage(named: "someImage"),
                 style: .plain,
                 target: self,
                 action: #selector(someSelector))
}

Вы также можете настроить NotificationCenter наблюдателей в файле viewWillAppear(_:). Но не забудьте отменить их в файле viewWillDisappear(_:).

viewDidAppear(_:)

Вызывается после добавления представления в иерархию представлений окон. Это правильное место для запуска анимации, если она у вас есть. Вы также можете начать выборку данных в viewDidAppear(_:) вместо viewWillAppear(_:).

override func viewDidAppear(_ animated: Bool) {
  super.viewDidAppear(animated)
  startSomeAnimation()
}

видБудетИсчезнуть(_:)

Этот метод вызывается, когда представление вот-вот исчезнет. Его можно вызвать, когда вы нажимаете или выталкиваете навигационный контроллер перед представлением или закрытием модального контроллера представления. Вы можете переопределить его, чтобы сохранить текущее состояние представления, сохранив его где-нибудь или отправив в API, чтобы отменить наблюдателей, слушателей и остановить таймеры.

override func viewWillDisappear(_ animated: Bool) {
  super.viewWillDisappear(animated)
  stopTimer()
  removeObserves()
  saveData()
}

viewDidDisappear(_:)

Этот метод вызывается, когда представление контроллера было удалено из иерархии представлений. Вы можете остановить свою анимацию здесь, или вы также можете сделать то, что вы делаете в viewWillDisappear(_:).

override func viewDidDisappear(_ animated: Bool) {
  super.viewDidDisappear(animated)
  activityIndicator.stopAnimating()
  someAnimation().stop()
}

Это в основном так. Мы рассмотрели все методы компоновки контроллера представления. Спасибо за ваше время. Я надеюсь, что вы нашли эту статью полезной.

Want to check other articles about iOS development?

Check out my profile.

Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 💰 Бесплатный курс собеседования по программированию ⇒ Просмотреть курс
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу