какой метод вызовется первым при открытии нового uiviewcontroller

Контроллер, полегче! Выносим код в UIView

У вас большой UIViewController? У многих да. С одной стороны, в нём работа с данными, с другой — с интерфейсом.

Задачи отделения логики от интерфейса описаны в сотнях статей про архитектуру: MVP, MVVM, VIPER. Они решают проблему потока данных, но не отвечают на вопрос как работать с интерфейсом: в одном месте остается создание элементов, лейаут, настройка, обработка ввода и анимации.

Давайте отделим view от controller и посмотрим чем нам поможет loadView().

loadView()

Мы можем переопределить метод и указать свой класс.

super.loadView() вызывать не нужно!

Теперь можно видеть переменные CustomView :

Руслан Кавецкий предложил убрать дублирование кода с помощью расширения протокола:

Для каждого нового контроллера нужно только указать протокол и подкласс для его UIView через typealias :

Код в подклассе UIView

Создание и настройка контролов

Шрифты, цвета, констрейнты и иерархию можно настроить прямо в конструкторе CustomView:

layoutSubviews()

Приватные контролы, публичные свойства

Если есть время, то я делаю property контролов приватными, но управляю ими через публичные переменные или функции «в области знаний». Проще на примере:

Преимущество в инкапсуляции: внутренняя логика скрыты за интерфейсом. Например, валидность объекта может показываться цветом области, а не квадрата, но контроллер ничего об этом не узнает.

Что остаётся во viewDidLoad()?

Если использовать Interface Builder, то часто viewDidLoad() пустой. Если view создавать в коде, то нужно привязать их действия через target-action паттерн, добавить UIGestureRecognizer или связать делегаты.

Настраиваем через Interface Builder

Подкласс для view можно настроить через Interface Builder (далее IB).

Нужно выделить объект view (не контроллер) и задать его класс. Писать собственный loadView() не нужно, контроллер сделает это сам. Но приводить тип UIView всё ещё приходится.

IBOutlet в UIView

IBAction в UIViewController

На мой вкус, контроллеру стоит оставлять все действия пользователя. Из стандартных:

Objective-C

Конец

В примере на GitHub можно посмотреть на разделение классов для простой задачи: цвет квадрата зависит от его положения (в зелёной области он зелёный, вне её — красный).

Источник

Жизненный цикл UIViewController

Большинство приложения под iOS пишутся с использованием UIKit, а значит, используют UIViewController. Они настолько же просты, насколько и сложны. Основная масса сложностей возникает из-за непонимания что, когда, как и зачем происходит внутри стандартных методов UIViewController.
Сразу определимся, разговор пойдет только о самых важных события жизненного цикла. Мы не будем касаться вопросов смены ориентации устройства, обработки событий клавиатуры, прерываний процесса работы и прочего.

Отдельно, стоит хорошо понимать, что на UIViewController «возложена» обязанность контроля не только над своим жизненым циклом, но и над циклом жизни собственного UIView.

Начнем с начала.
Создание UIViewController
init
initWithNibName:

Уничтожение UIViewController
dealloc

Создание UIView
isViewLoaded
loadView
viewDidLoad
initWith****

Обработка изменения состояния UIView
viewDidLoad
viewWillAppear
viewDidAppear
viewWillDisappear
viewDidDisappear
viewDidUnload

Уничтожение UIView
viewDidUnload

Обработка нехватки памяти
didReceiveMemoryWarning

«Жизнь» начинается.
Независимо от того, как именно инциализируется контроллер (UIViewController) (с подключение *.NIB файла или нормально), происходит вызов метода init, в котором и появляется значение переменной self, вернее, ее значение перестает быть nil и заменяется указателем на конкретный блок памяти.
ВАЖНО! Инициализируется только сам контроллер. Никакого вида (UIView) не существует (хотя он и инициализирован, т.е. обращение к self.view возможно). Если вы использует NIB-ы — никаких оутлетов на этом этапе еще нет. Соответственно — попытка создания или обращения к визуальным компонентам приведет к ошибке.
СТОИТ ПОМНИТЬ! В любой момент можно проверить, загружен вид в память или нет (а соответственно, можно ли обращаться к визуальным элементам) с помощью метода isViewLoaded. Главная его особенность в том, что он не «провоцирует» загрузку вида, если еще не загружен.

Создание вида (UIView).
В самом общем случае, создание вида (его загрузка в память) начинается в тот момент, когда произойдет любое обращение к self.view. Будет вызван метод loadView, результатом которого будет или созданный пустой вид, либо вид с элементами из NIB-а. Именно в этот момент наш котроллер и его вид становятся полностью доступными.
По оканчании загрузки будет вызван метод viewDidLoad
ВАЖНО! Загрузка вида, это именно загрузка, т.е. размещение всего необходимого для отображения вида в памяти. Не более того. Все загрузили и подготовили. Ждем команды «показать».
СТОИТ ПОМНИТЬ! Если вы интерфейс создаете нормально, т.е. с использованием кода, то собственные элементы интерфейса вы можете создавать/добавлять на вид/настраивать как в методе loadView, так и в метода viewDidLoad.
Если вы используете NIB-ы, то для настройки элементов интерфейса вам доступен только метод viewDidLoad.

Жизнь вида.
viewDidLoad — вид загружен и полностью готов к работе. Многим нравится именно в этом методе делать, т.с. «вторую часть инициализации контроллера». Привычка — вторая натура.
viewWillAppear — будет вызван перед тем, как начать отображение вида. В случае, если для отображения используется анимация — перед началом анимации.
viewDidAppear — будет вызван после окончания отображение вида. В случае, если для отображения используется анимация — после окончания анимации отображения.

Читайте также:  проспект строителей это какой район

viewWillDisappear — тоже, что и viewWillAppear, только когда вид прекращает отбражение.
viewDidDisappear — тоже, что и viewDidAppear, только когда вид прекращает отбражение.

viewDidUnload — вид выгружен из памяти
ВАЖНО! Выгружен сам вид, но не элементы интерфейса, которые мы создавали. Именно в этом методе их нужно уничтожить. Если вы используете NIB-ы — пришла пора очистить все оутлеты. Если вы этого не сделаете, система за вас это делать не будет.

Конец жизненного пути контроллера.
Когда вы уничтожите контроллер (указатель на него сбросите в nil) ARC очистит выделенную для него память. Перед этим будет вызван метод dealloc. Именно в нем нобходимо выполнить очистку и обнуление всех указтелей, которые вы создали для использования внутри контроллера.
ВАЖНО! Если вид контроллера еще отображается, а вы обнулите указатель на сам контроллер, то dealloc — будет вызван, а viewDidUnload — нет, вернее, скорее всего, что нет.

Обработка нехватки памяти
Метод didReceiveMemoryWarning вызывается системой, при нехватке памяти.
По умолчанию, реализация этого метода для контроллера, который не находится в видимой области, вызывает освобождение и удаление вида, что, в свою очередь, приведет к вызову viewDidUnload.
В любом случае — если система «потребовала» (этот метод — это именно требование) вам необходимо его исполнить как можно эффективней.
СТОИТ ПОМНИТЬ! Бог любит троицу. Система дажды потребует освобождения памяти (если вы не поняли с первого раза). Третий раз требование придет вместе с остановкой программы по критической ошибке. Все очень просто и надежно.

На последок…
Этот текст не является полной пошаговой инструкцией. Я коснулся только некоторых важных азов. Дерзайте и познавайте.
ВАЖНО! Работая с памятью, помните — сам взял, сам — вернул.

Источник

Жизненный цикл UIViewController

Жизненный цикл UIViewController

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

Присоединяйтесь к нашей группе в «ВКонтакте»:
https://vk.com/swiftbook

4 Комментария

А если открыть вью, потом закрыть и снова открыть? При повторном открытии какие методы срабатывают?

В контексте данного примера повторно сработают все методы.

Видео очень полезное, спасибо, Алексей! казалось бы, столько курсов пройдено, а вот такие важные вещи раньше не были прозрачны.

Комментарии Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

Источник

Xcode уроки. Урок 3. Элементы управления и представления

В этом уроке разберём основные методы UIViewController, какие существуют элементы в среде Xcode и как добавить элементы из библиотеки объектов на окно будущего приложения.

Цель урока: Знакомство с элементами управления (представления) и с их базовыми классами для создания простого пользовательского интерфейса.

Шаблон приложения Single View имеет файл исходного кода: ViewController.swift. Для отображения содержимого файла, достаточно его выбрать в навигаторе проекта.

Этот файл определяет пользовательский подкласс UIViewController с именем ViewController. Этот класс просто наследует все поведение, определенное UIViewController. Чтобы переопределить или расширить это поведение, необходимо переопределить методы, определенные в UIViewController.

Методы UIViewController

Объект класса UIViewController (и его подклассы) поставляется с набором методов, которые управляют своей иерархией представлений. iOS автоматически вызывает эти методы в соответствующее время, когда контроллер просмотра переходит между состояниями. Этот процесс называется жизненным циклом ViewController’а.

iOS вызывает методы UIViewController в порядке, приведённом в таблице, в которой также содержится описание этих методов.

Порядок вызова Название метода Описание метода
1 init Инициализация.
2 loadView Загрузка и создание View.
3 viewDidLoad Этот метод вызывается после того, как контроллер представления загрузил свою иерархию представлений в память. Используется этот метод для выполнения любой дополнительной настройки, требуемой контроллером.
4 viewWillAppear Вызывается непосредственно перед представлением содержимого контроллера просмотра в иерархию представлений приложения. Используется этот метод для запуска любых операций, которые должны выполняться до представления содержимого на экране. Несмотря на название, только потому, что система вызывает этот метод, он не гарантирует, что просмотр содержимого станет видимым. Представление может быть закрыто другими видами или скрытыми. Ориентация экрана не определена.
5 viewWillLayoutSubviews Вызывается перед обновлением ориентации экрана.
6 viewDidLayoutSubviews Вызывается после обновления ориентации экрана.
7 ViewDidAppear Вызывается сразу после того, как представление содержимого контроллера просмотра добавлено в иерархию представлений приложения. Используется этот метод для запуска любых операций, которые должны произойти, как только представление будет представлено на экране, например, выборка данных или отображение анимации. Несмотря на имя, только потому, что система вызывает этот метод, он не гарантирует видимость содержимого. Представление может быть закрыто другими видами или скрытыми. Этот метод просто указывает, что представление содержимого было добавлено в иерархию представлений приложения.
8 viewWillDisappear Вызывается перед очисткой экрана. Этот метод используется для выполнения задач очистки.
9 viewDidDisappear Вызывается сразу после того, как представление содержимого контроллера просмотра было удалено из иерархии представлений приложения.

Элементы управления

UIControl – базовый класс для элементов управления, которые являются визуальными элементами, которые передают конкретное действие в ответ на взаимодействие пользователя. Элементы управления являются визуальными строительными блоками пользовательского интерфейса приложения. Основные элементы управления отображены в следующей таблице.

Изображение элемента Класс элемента Описание элемента
UIButton Элемент управления, который выполняет программный код или действия в ответ на взаимодействие с кнопкой. Внешний вид кнопок настраивается.
UIDatePicker Элемент управления, используемый для ввода значений даты и времени. Используется, чтобы пользователь мог ввести либо момент времени (календарную дату, время), либо временной интервал (например, для таймера).
UIPageControl Элемент управления, который отображает горизонтальную серию точек, каждая из которых соответствует странице документа приложения или другого объекта модели данных.
UISegmentedControl Горизонтальный элемент управления, который состоит из нескольких сегментов, каждый сегмент функционирует как дискретная кнопка.
UISlider Элемент управления, используемый для выбора одного значения из непрерывного диапазона значений.
UIStepper Элемент управления, используемый для увеличения или уменьшения значения.
UISwitch Элемент управления, который предлагает двоичный выбор, например On/Off.

Элементы представления

Если для элементов управления основным классом является UIControl, то для элементов представления основным классом является UIView. Также корневым классом для UIControl является класс UIView. Основные элементы представления отображены в следующей таблице:

Тип View Класс элемента Описание элемента
Container Views Collection Views Отображение вложенных представлений с помощью настраиваемого макета.
UITableView В представлении таблицы представлены данные в прокручиваемом списке из нескольких строк, которые можно разделить на разделы.
UIStackView Оптимизированный интерфейс для создания коллекции представлений в столбце или строке.
Container Views UIScrollView Представление, которое позволяет прокручивать и масштабировать свои скрытые представления.
Text Views UILabel Представление, которое отображает одну или несколько строк текста только для чтения, которые часто используются вместе с элементами управления для описания их предполагаемой цели.
UITextField Объект, который отображает редактируемую текстовую область в интерфейсе.
UITextView Прокручиваемая многострочная область текста.
UIActivity IndicatorView Представление, показывающее, что выполняется загрузка.
Content Views UIImageView Объект, который отображает одно изображение или последовательность анимированных изображений в интерфейсе.
UIPickerView Представление, в котором отображается текст с эффектом «игрового автомата», чтобы показать один или несколько наборов значений.
UIProgressView Представление, которое отображает ход выполнения задачи с течением времени.
UIWebView Представление, встраивающее веб-контент в приложение.

Создание простого проекта с графическим интерфейсом

Для создания простого проекта достаточно добавить из библиотеки объектов элементы UIButton и UILabel. UIButton является кнопкой, а UILabel отображает пользовательский текст. Для добавления достаточно «тянуть» нужные объекты на экран будущего приложения. Любой элемент можно найти в библиотеке, используя строку поиска:

Необходимо присвоить элементу Label текст «Hello World», а кнопке – «Press Me». У XCode есть два свойства, через которые можно соединить элементы интерфейса с программным кодом: IBActions (объект управления (действия) и IBOutlets (объект выхода)). [Первые две буквы IB обозначают Interface Builder]

Удерживая кнопку CTRL на клавиатуре, необходимо перетащить от элемента Label специальную синюю линию на открытый параллельно файл ViewController с кодом программы в свободное место в классе ViewController:

В появившемся окне необходимо выбрать в поле «Connection» тип «Outlet», т.к. label будет являться элементом выхода, потому что на нём отображается текст. После нажатия на кнопку «connect» можно увидеть, что Xcode сгенерирует строку кода. Этот код является некой переменной, которая позволит в дальнейшем получить доступ к созданной текстовой метке.

В программном коде появится упоминание об элементе Label:

Таким же образом производится привязка кнопки к коду. Используя клавишу CTRL, необходимо перенести линию в свободный участок кода и в появившемся окне выбрать тип соединения «Action» и дать имя кнопке – «buttonWasPressed», затем необходимо нажать кнопку «Connect»:

На этот раз Xcode сгенерирует целую функцию в программном коде. Теперь мы сообщили IDE всю необходимую информацию об имеющихся элементах.

Например, сделаем простое действие – при нажатии кнопки должно производиться изменение текста в label. Это очевидно, что работать необходимо с функцией, которая создалась при соединении кнопки с программным кодом (ButtonWasPressed ()). Необходимо добавить следующие строки в функцию:

Как видно, теперь можно получить доступ к текстовому элементу, используя выход textLabel, а изменять текст можно, обращаясь к свойству «text» этого элемента. Данный код выполняясь, будет проверять содержимое label, и если там содержится текст «Hello World», то текст поменяется на «Bye, World!», иначе он станет «Hello World». Соответственно, каждый раз тексты будет сменять друг друга всякий раз, когда пользователем нажимается кнопка.

Источник

Глядя, чтобы понять жизненный цикл iOS UIViewController

не могли бы вы объяснить мне правильно управлять UIViewController жизненный цикл?

12 ответов

на сайте Apple есть отличная документация здесь. Говоря просто, хотя:

жизненный цикл UIViewController показан здесь:

это для последних версий iOS (изменено с Xcode 9.3, Swift 4.1). Ниже приведены все этапы, которые делают жизненный цикл a UIViewController завершить.

viewWillAppear (_animated: Bool)

viewDidAppear(_ анимированных: Боол)

viewWillDisappear (_animated: Bool)

viewDidDisappear (_animated: Bool)

позвольте мне объяснить все эти этапы.

1. loadView

это событие создает представление, которым управляет контроллер. Он вызывается только при программном создании контроллера представления. Это делает его хорошим местом для создания ваших представлений в коде.

2. loadViewIfNeeded

если incase представление текущего viewController еще не установлен, тогда этот метод загрузит представление, но помните, что это доступно только в iOS >=9.0. Поэтому, если вы поддерживаете iOS

3. метод viewDidLoad

на viewDidLoad событие вызывается только при создании и загрузке представления в память, но границы представления еще не определены. Это хорошее место для инициализации объектов, которые будет использовать контроллер представления.

4. viewWillAppear

это событие оповещает viewController всякий раз, когда появляется на экране. На этом шаге представление имеет определенные границы, но ориентация не задана.

5. viewWillLayoutSubviews

6. viewDidLayoutSubviews

это событие уведомляет контроллер вида, что подвиды были настроены. Это хорошее место для внесения любых изменений в подвиды после их установки. Это доступно только в iOS >=5.0. Так что если вы поддерживают iOS

7. viewDidAppear

на viewDidAppear событие срабатывает после представления на экране. Что делает его хорошим местом для получения данных из серверной службы или базы данных.

8. viewWillDisappear

9. viewDidDisappear

это последний шаг жизненного цикла, который любой может решить, как это событие срабатывает сразу после просмотра представленного viewController исчез, уволен, прикрыт или спрятан.

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

надеюсь, что это помогло. Спасибо.

iOS 10,11 (Swift 3.1, Swift 4.0)

по данным UIViewController на UIKit разработчиков

1. loadView()

здесь подклассы должны создавать свою пользовательскую иерархию представлений, если они не используют Сиб. Никогда не следует звонить напрямую.

2. loadViewIfNeeded ()

загружает представление контроллера вида, если оно еще не было набор.

3. viewDidLoad ()

вызывается после загрузки представления. Для контроллеров представления, созданных в коде, это after-loadView. Для контроллеров представления, неархивированных из nib, это после установки представления.

4. viewWillAppear (_animated: Bool)

вызывается, когда представление собирается сделать видимым. По умолчанию ничего не делает

5. viewWillLayoutSubviews ()

вызывается сразу после метод layoutSubviews вид контроллера вид вызывается. Подклассы могут реализовываться по мере необходимости.

6. viewDidLayoutSubviews()

называется, когда размер,положение и ограничения применяются ко всем объектам.

7. viewDidAppear (_animated: Bool)

вызывается, когда представление полностью переведено на экран. По умолчанию ничего не делает

8. viewWillDisappear(_ анимированных: Боол)

вызывается, когда представление отклонено, закрыто или иным образом скрыто. По умолчанию ничего не делает

9. viewDidDisappear (_animated: Bool)

вызывается после того, как представление было отклонено, закрыто или иным образом скрыто. По умолчанию ничего не делает

10. viewWillTransition (размер: CGSize, с координатором: UIViewControllerTransitionCoordinator)

вызывается, когда вид Переход.

11. willMove (toparentviewcontroller родитель: UIViewController?)

12. didMove (toparentviewcontroller родитель: UIViewController?)

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

Родительский аргумент в обоих этих методах равен нулю, когда ребенок удален из родительского элемента; в противном случае он равен новому контроллеру родительского вида.

13. didReceiveMemoryWarning()

вызывается, когда родительское приложение получает предупреждение памяти. В iOS 6.0 он больше не будет очищать представление по умолчанию.

начиная с iOS 6 и выше. Новая диаграмма выглядит следующим образом:

ответ Хайдера верен для pre-iOS 6. Однако с iOS 6 viewDidUnload и viewWillUnload никогда не вызываются. The docs состояние: «представления больше не очищаются в условиях нехватки памяти, поэтому этот метод никогда не вызывается.»

давайте сосредоточимся на методах, которые отвечают за UIViewController жизненный цикл:

создание:

посмотреть творение:

— (UIView *)initWithCoder:(NSCoder *)coder

обработка изменения состояния представления:

памяти предупреждение обращение:

освобождение

для получения дополнительной информации, пожалуйста, взгляните на Ссылка На Класс UIViewController.

там много устаревшей и неполной информации. Для iOS 6 и новее только:

Примечания:

(b) можно назвать дополнительным 0 или более раз.

Это изображение показывает допустимые переходы состояния между различными методами обратного вызова view «will» и «did»

когда этот метод вызывается, ваше представление, вероятно, будет отображаться когда-нибудь в ближайшем будущем (или в самом ближайшем будущем), но на данный момент нет никакой гарантии, что это на самом деле будет отображаться. Так что, возможно, сейчас самое время начать приводить все в порядок, но не слишком много, иначе вы потеряете вычислительную мощность. В этом методе можно создавать экземпляры зависимостей, включая вложенные представления, которые будут добавлены в представление программным способом. И обратите внимание, что init(coder:) вызывается только один раз в течение жизни объекта, как и все методы init.

Источник

Читайте также:  какой пдф формат лучше
Сказочный портал