Использование Swift 1.1 и Xcode 6.2.
У меня есть доска UIStoryboard, содержащая единственный настраиваемый UIViewController
подкласс. На нем у меня есть @IBOutlet
соединение типа UIView
этого контроллера с UIView
подклассом в раскадровке. У меня также есть аналогичные выходы для подвидов этой точки зрения. Рисунок А.
Но во время выполнения эти свойства равны нулю (рисунок B). Хотя я заверил, что подключил розетки в Interface Builder.
Мысли :
- Возможно ли, что из-за того, что я использую подкласс подкласса, что-то не так с инициализацией? Я не отменяю инициализаторы
awakeFromNib:
по какой-то причине не звонят- Возможно, он не подключается к подпредставлениям на подпредставлениях
Вещи, которые я пробовал:
- Точное соответствие
@IBOutlet
и типы элементов раскадровки (вместоUIView
) - Удаление собственности и торговой точки и их повторное добавление
Рисунок A *
Рисунок B
* Скрытый код Figure A
:
@IBOutlet private var annotationOptionsView: UIView!
@IBOutlet private var arrivingLeavingSwitch: UISegmentedControl!
Спасибо.
clearView
я ожидаю, что будет ноль. Это то, что мне еще предстоит рефакторинг. Также см. Сноску к рисунку A. @ShaanSingh Так и должно быть! потому что соединения из раскадровки (должны быть) установлены во время выполнения и не должны быть нулевыми.let vc = UIStoryboard(name: "LocationPickerModal", bundle: nil) .instantiateViewControllerWithIdentifier("LocationPickerModalViewController") as LocationPickerModalViewController
Ответы:
Обычно это происходит из-за того, что ваш контроллер представления еще не загрузил свою иерархию представлений. Контроллер представления загружает свою иерархию представления только тогда, когда что-то отправляет ему
view
сообщение. Система делает это, когда пора фактически поместить иерархию представлений на экран, что происходит после таких действий, какprepareForSegue:sender:
иviewWillAppear:
, вернулись.Поскольку ваш VC еще не загрузил свою иерархию представлений, ваши выходы по-прежнему равны нулю.
Вы можете заставить VC загрузить свою иерархию представлений, сказав
_ = self.view
.источник
viewWillAppear:
вызове, когда я впервые что-либо делаю с этой розеткой. Доступ к представлению ничего не делает для меня. По-прежнему ноль.UIViewcontroller.loadViewIfNeeded()
- правильный метод здесь.Вы пробовали запустить Продукт> Очистить. Решил для меня очень похожую проблему.
источник
DerivedData
папку с проектом.Вы создали экземпляр своего контроллера представления из раскадровки или NIB, или вы создали его напрямую через инициализатор?
Если вы создали экземпляр своего класса напрямую с помощью инициализатора, выходы не будут подключены. Интерфейсный Разработчик создает настроенные экземпляры ваших классов и кодирует эти экземпляры в NIB и Раскадровки для повторного декодирования, он не определяет сами классы. Если это была ваша проблема, вам просто нужно изменить код, в котором вы создаете контроллер, чтобы вместо этого использовать методы на UIStoryboard или UINib.
источник
UIStoryboard
экземпляр и вызываюinstantiateViewControllerWithIdentifier
его.Раскадровка не распознавала какие-либо дополнительные элементы пользовательского интерфейса, которые я добавил к ней. Во время выполнения все ссылки были нулевыми. Итак, я очистил папку с производными данными, и затем эти соединения снова заработали.
источник
viewDidLoad()
все подключения были сделаны, ноviewWillAppear()
почти все былиnil
(иногда одно или два все же были подключены). Я все перепробовал и, наконец, удалил папку с производными данными, перестроил, и все было хорошо.Это происходило со мной с моей пользовательской ячейкой представления коллекции. Оказывается, мне пришлось заменить мой метод registerClassforReuseIdentifier на registerNib. Это исправило это для меня.
источник
Это произошло для меня, потому что я случайно создавал экземпляр своего контроллера представления напрямую, вместо того, чтобы создавать его через раскадровку. Если вы создаете экземпляр напрямую через,
MyViewController()
выходы не будут подключены.источник
В моем случае это произошло из-за того, что я переопределил
loadView
метод в своем подклассе ViewController, но забыл добавить[super loadView]
Когда вы отменяете
loadView
метод, ответственность за инициирование вложенных представлений. Поскольку вы его переопределяете, представления из построителя интерфейса не имеют возможности преобразоваться в объекты какао, и, следовательно, выходы остаются нулевыми.Если вы реализуете loadView в своем подклассе контроллера представления, тогда вы несете ответственность за загрузку элементов пользовательского интерфейса из раскадровки / xib в код.
Или просто позвони
Чтобы суперкласс получил возможность загрузить раскадровку / xib в код.
источник
Вы можете вызвать
controller.view
принудительную загрузку представления для инициализации IBOutlets, после чего вы сможете назначать значения.источник
Если вы создаете экземпляр
view controller
программно. Затем попробуйте создать его, как показано нижевместо прямого
Это сработало для меня.
источник
Для меня это произошло, когда я случайно объявил класс своего контроллера представления как
(т.е. как
UINavigationController
не аUIViewController
).Xcode не улавливает эту ошибку, класс, похоже, строится нормально, и функции переопределения, такие как
viewDidLoad
,viewWillAppear
и т. Д., Работают правильно. Но ни один из нихIBOutlet
не связан.Изменение декларации на
исправил это полностью.
источник
Я недавно столкнулся с этой проблемой! Вот моя мысль. Проблема не в вашей раскадровке или проблемах со ссылками. Это о том, как вы запускаете свой ViewController. Особенно, когда вы используете Swift. (Когда вы создаете файл класса, в редакторе почти ничего нет)
Просто используя
init()
суперкласс from, вы не можете инициировать что-либо, что вы работали с раскадровкой. Итак, что вам нужно сделать, это изменить инициализацию ViewController. Replacelet XXViewController = XXViewController()
bylet XXViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("XXViewController") as! XXViewController
This сообщает программе перейти к раскадровке, найти XXViewController и инициировать всеIBOutlet
в вашей раскадровке.Надеюсь на эту помощь ~ GL
источник
2019, ОДНА ВОЗМОЖНОСТЬ ЭТОЙ УЖАСНОЙ ПРОБЛЕМЫ:
Допустим, у вас есть представление контейнера, в котором отображаются какие-то часы. Так что у тебя есть
класс Часы: UIViewController
Фактически вы используете его во многих местах приложения .
На главном экране, на экране сведений, на экране редактирования.
У вас сложное современное приложение, похожее на Snapchat.
На самом деле,
Clock
может быть на самом деле загружен более чем один раз в то же время где - то на одном экране . (Возможно, в некоторых случаях это скрыто.)Вы начинаете работать над одним экземпляром
Clock
одной из множества раскадровок.На этой раскадровке вы добавляете метку NewLabel.
Естественно, вы добавляете розетку в код. Все должно работать. Все остальные розетки работают отлично.
Вы точно подключили розетку.
Но приложение вылетает с NewLabel как nil.
Xcode четко сообщает вам, что «вы забыли подключить розетку».
Причина в том, что .......... у вас есть "NewLabel" только в одном из вариантов раскадровки Clock!
На самом деле авария произошла из >>> другого места <<<< вы используете Clock !!!!
Xcode не сообщает вам, что сбой произошел совсем из другого места, а не из того места, где вы работаете!
На самом деле сбой происходит не из того места, где вы работаете, а из другого раскадровки, где нет элемента «NewLabel» на этой раскадровке !!!
Разочарование.
источник
Для Swift 3.
источник
Вам необходимо сначала загрузить иерархию представлений, чтобы создать экземпляры выходов в раскадровке. Для этого вы можете вручную вызвать методы loadView или loadViewIfNeeded.
источник
В моем случае приложение внезапно начало вылетать. Отладка показала, что все розетки были еще
nil
на моментviewDidLoad()
.Мое приложение по-прежнему использует перья (а не раскадровки) для большинства контроллеров представлений. Все было на месте, все розетки подключены правильно. Я перепроверил.
Обычно мы создаем экземпляры наших контроллеров представления как
... который по какой-то причине, кажется, работает, пока .xib назван так же, как класс контроллера представления (хотя не уверен, как это работает. Мы не вызываем
init(nibName:bundle:)
с нулевыми аргументами или переопределяем,init()
чтобы сделать это,self
как это обычно предлагается ...).Поэтому я попытался явно вызвать
... только для того, чтобы встретить ошибку исключения времени выполнения:
А потом я увидел это:
Флажок «Целевое членство» файла .xib был снят.
Должно быть, это произошло при разрешении одного из частых конфликтов слияния, касающихся файла проекта Xcode.
Apple определенно нужно придумать формат файла проекта, более удобный для SCM.
источник
100% рабочее решение для создания ViewControllers из XIB без StoryBoards
7.1.
7.2.
7.3.
источник
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)
и вызвать шаг 7.2self
непосредственно в классе CustomViewController.Проверьте ваше соединение IBOutlet, если оно связано с владельцем файла или представлением. Возможны ошибки.
источник
Другой случай:
Ваши выходы не будут настроены до тех пор, пока не будет фактически создан экземпляр представления контроллера представления, что в вашем случае, вероятно, происходит вскоре после initWithNibName: bundle: - в этот момент они все равно будут равны нулю. Любая настройка, которая включает эти выходы, должна происходить в методе -viewDidLoad вашего контроллера представления.
источник
Для меня у меня была такая же ошибка на локализованной раскадровке, элемент был добавлен в одном языковом стандарте, а не в другом, поэтому у меня была пустая ссылка для этого элемента при переключении на языковой стандарт отсутствующего элемента, мне пришлось удалить (избыточную) локализацию для эта раскадровка с использованием https://stackoverflow.com/a/42256341/1356559 .
источник
Для меня это было сбоем, потому что
containerView
было равно нулю.Вот мой код с Crash .
Недостающее звено называлось
super.loadView()
. Итак, добавление решило проблему для меня.Фиксированный код :
источник
У меня была аналогичная проблема, когда я ранее добавил регистр (_: forCellReuseIdentifier :) для настраиваемой ячейки после того, как я уже определил идентификатор в раскадровке. Был этот код в функции viewDidLoad (). Как только я его удалил, все заработало.
источник
Еще один случай, с которым я только что столкнулся. Я изменил имя своего класса для UIViewController, но забыл изменить имя файла .xib, в котором был построен интерфейс.
Как только я уловил это и заставил имена файлов отражать имя класса, все стало хорошо!
Надеюсь, это кому-то поможет.
источник
Получил еще один ...
Если у вас есть собственный класс для UITableViewCell, но вы забыли указать Custom в стиле ячейки.
источник
Вы можете проверить, загружен ли вид.
источник
.h
и.m
просмотрите файлы контроллераисточник
Случайно я разделил свой контроллер представления на подклассы
AVPlayerViewController
вместоUIViewController
. Воспроизведя его, чтобыUIViewController
все стало нормально. Это должно помочь.источник
У меня была такая же проблема после копирования класса (связанного с xib), чтобы повторно использовать его с другим классом viewcontroller (связанным с раскадровкой). Я забыл удалить
и
методы.
После их снятия заработали мои розетки.
источник
Я вижу, вы пользуетесь
ViewController
!? вViewController
классе вы должны использовать-viewDidLoad
, не-awakeFromNib
,-awakeFromNib
использовать дляUIView
классаисточник
Проверьте, нет ли у вас отсутствующих или отключенных розеток.
источник
main.storyboards
Это может произойти, если у вас их два и вы вносите изменения не в тот. Это может произойти в любое время, когда вы подключаете розетку к неустановленной сетиstoryboard
.источник