Создание пользовательского видового контроллера из файла xib работает?

#swift #uikit

Вопрос:

Я новичок в Свифте. У меня есть один CustomViewController.xib , который связан с моим CustomViewController . Розетки и все подключены.

Почему я могу позвонить CustomViewController() и могу представить его с розетками, которые все работают нормально? Я вижу множество примеров, и, предположительно, так и должно быть CustomViewController(nibName: nil, bundle: nil) .

Спасибо.

Комментарии:

1. Не могли бы вы, пожалуйста, отправить код для CustomViewController ?

2. Да, вы реализуете loadView() в своем контроллере просмотра? У вас есть пользовательская реализация этого инициализатора? Есть ли в вашем проекте какие-либо расширения для UIViewController, которые переопределяют метод инициализации?

3. Очень вероятно, что есть просто инициализатор удобства UIViewController, который вызывает указанный инициализатор nil для обоих параметров.

4. Проекта у меня есть несколько кодов, что это не мое, поэтому я не могу поделиться этим, но насколько я могу видеть,это очень простой файл ViewController, там ничего особенного и нет loadView() , что я вижу, и искать extension для UIViewController поворачивает вверх ничего, поэтому я думаю, что нет специальные вспомогательные функции или иниц, и, следовательно, мое замешательство. Я использую Xcode 12.5.1 на Swift 5.

Ответ №1:

Похоже, Apple сделала «пустой» инициализатор для контроллеров представлений интеллектуальным, так что он будет искать файл XIB, содержащий представления контроллера представлений, и откроет его, если он соответствует обычному соглашению об именовании файлов XIB контроллера представлений.

(либо назовите файл XIB тем же именем, что и класс VC, либо, если имя класса заканчивается на «ViewController», усеките этот суффикс до «View».)

Смотрите эту статью от Apple:

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621487-nibname

Это обсуждение свойства UIViewController nibName . В нем говорится, в частности:

Если вы используете файл наконечника для хранения представления контроллера представления, рекомендуется явно указать этот файл наконечника при инициализации контроллера представления. Однако, если вы не укажете имя наконечника и не переопределите метод loadView() в своем пользовательском подклассе, контроллер представления выполнит поиск файла наконечника с помощью других средств. В частности, он ищет файл наконечника с соответствующим именем (без расширения .nib) и загружает этот файл наконечника всякий раз, когда запрашивается его просмотр. В частности, он ищет (по порядку) файл наконечника с одним из следующих имен:

Я попробовал тест и создал новый контроллер представления SecondViewController в тестовом проекте Xcode, проверив «Также создать файл XIB». Это дало файлу XIB имя «SecondViewController.xib». Когда я это сделал, я смог создать экземпляр контроллера представления с помощью SecondViewController() , и он загрузил свои представления.

Таким образом, кажется, что то, что init(nibName:bundle: ) делает, — это устанавливает соответствующие свойства nibName и nibBundle на экземпляре контроллера представления. Затем, когда ваш контроллер представлений пытается загрузить свои представления, он пытается открыть файл XIB, как описано выше.

Я действительно удивлен таким поведением. Я никогда не мог создать контроллер представления из XIB, просто вызвав его из его init() метода.

Комментарии:

1. Большое спасибо за ответ! Это хорошее обучение, спасибо!