Вторая вкладка TabBarController не создается -> IBOutlets - ноль
Я создаю простое приложение с контроллером панели вкладок, где сводка - это одна вкладка, а история - другая. На вкладке сводки есть кнопка для добавления нового раунда. Всякий раз, когда этот раунд добавляется, он также должен переходить на вкладку истории.
Я пытаюсь отправить данные через tabBarController.
Что я испытываю, так это всякий раз, когда я не открываю вкладку истории перед добавлением нового раунда, моя программа падает, потому что мои IBOutlets равны нулю. Но всякий раз, когда я открываю вкладку, а затем возвращаюсь, чтобы добавить новый раунд, он работает нормально. Мне также не нужно открывать вкладку после каждого раунда. Похоже, что вкладка не создается, прежде чем я открываю ее в первый раз.
GIF неудачи (Ошибка в том, что график View
это ноль): https://i.imgur.com/VPa0RmK.gifv
Gif успеха: https://i.imgur.com/LqxYBjV.gifv
Есть ли способ сделать это вручную?
Я новичок в программировании на iOS, так что я думаю, что проблема в этом. Если происходит что-то еще, что разрушает мой код, я хотел бы знать!
2 ответа
Вы правы. Проблема в том, что выходы для второй вкладки не настраиваются, пока вы не перейдете на эту вкладку.
Решения:
Вы можете записать данные в свойство второго viewController, а затем переместить эти данные в розетку с переопределением
viewWillAppear
,Другой возможностью является проверка, если розетка
nil
прежде чем писать в него. Если это так, позвонитеloadView
на втором viewController, чтобы сказать ему, чтобы настроить свои выходы, и тогда вы сможете написать им. Обратите внимание, если вы звонитеloadView
вручную, методviewDidLoad
затем не будет работать, так что если вы делаете какие-либо дополнительные настройки там, вам также нужно будет сделать это изloadView
,Возможно, даже проще, чем звонить
loadView
вручную, чтобы вызватьviewDidLoad
второго ViewController путем доступа кview
имущество. Это может быть так просто, как:if let svc = self.tabBarController?.viewControllers?[1] as? SecondViewController { // check if outlet is nil if svc.myLabel == nil { // trigger viewDidLoad to set up the outlets _ = svc.view } svc.myLabel = "Success!" }
Тем не менее, прямой доступ к представлениям другого viewController (то есть к выходам) - плохой дизайн и нарушение парадигмы MVC (Model-View-Controller). Вы должны действительно поместить свои данные в место, к которому могут получить доступ все вкладки, а затем сделать так, чтобы каждый viewController обновлялся сам в
viewWillAppear
когда вкладка выбрана. Смотрите этот ответ: Обмен данными в TabBarController для одного способа сделать это.
Вот как это должно работать. Каждая вкладка создается только тогда, когда она должна быть отображена. Это та же идея для TableViews и CollectionViews.
Самый простой способ исправить это - переопределить метод viewWillAppear (или viewDidAppear) вашего HistoryViewController и обновить оттуда пользовательский интерфейс.
Таким образом, вы никогда не предполагаете, что вкладка "История" существует на вкладке "Сводка", "История" обновляет свой пользовательский интерфейс.
Надеюсь это поможет.