Вторая вкладка TabBarController не создается -> IBOutlets - ноль

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

Я пытаюсь отправить данные через tabBarController.

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

GIF неудачи (Ошибка в том, что график View это ноль): https://i.imgur.com/VPa0RmK.gifv

Gif успеха: https://i.imgur.com/LqxYBjV.gifv

Есть ли способ сделать это вручную?

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

2 ответа

Решение

Вы правы. Проблема в том, что выходы для второй вкладки не настраиваются, пока вы не перейдете на эту вкладку.

Решения:

  1. Вы можете записать данные в свойство второго viewController, а затем переместить эти данные в розетку с переопределением viewWillAppear,

  2. Другой возможностью является проверка, если розетка nil прежде чем писать в него. Если это так, позвоните loadView на втором viewController, чтобы сказать ему, чтобы настроить свои выходы, и тогда вы сможете написать им. Обратите внимание, если вы звоните loadView вручную, метод viewDidLoad затем не будет работать, так что если вы делаете какие-либо дополнительные настройки там, вам также нужно будет сделать это из loadView,

  3. Возможно, даже проще, чем звонить 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!"
    }
    
  4. Тем не менее, прямой доступ к представлениям другого viewController (то есть к выходам) - плохой дизайн и нарушение парадигмы MVC (Model-View-Controller). Вы должны действительно поместить свои данные в место, к которому могут получить доступ все вкладки, а затем сделать так, чтобы каждый viewController обновлялся сам в viewWillAppear когда вкладка выбрана. Смотрите этот ответ: Обмен данными в TabBarController для одного способа сделать это.

Вот как это должно работать. Каждая вкладка создается только тогда, когда она должна быть отображена. Это та же идея для TableViews и CollectionViews.

Самый простой способ исправить это - переопределить метод viewWillAppear (или viewDidAppear) вашего HistoryViewController и обновить оттуда пользовательский интерфейс.

Таким образом, вы никогда не предполагаете, что вкладка "История" существует на вкладке "Сводка", "История" обновляет свой пользовательский интерфейс.

Надеюсь это поможет.

Другие вопросы по тегам