#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. Большое спасибо за ответ! Это хорошее обучение, спасибо!