Как ссылаться на `IBOutlet`s в подпредставлениях` UIPageViewController` - PullRequest
0 голосов
/ 08 января 2019

Я читаю, если вы создаете экземпляр класса (UIViewController) напрямую, через инициализатор, IBOutlets не будут подключены. Моя проблема в том, что я ссылаюсь на ноль IBOutlet, вызывая сбой.

У меня есть много наблюдателей, которые обновляют представления в vc1, vc2 и vc3 ("страницы" в UIPageViewController). Чтобы сохранить мой код в чистоте, я хочу добавить всех наблюдателей в классе UIPageViewController, а не в viewDidLoad из vc1, vc2, & vc3.

Однако я не могу сослаться на IBOutlets подпредставлений из UIPageViewController, потому что они подходят к нулю. У кого-нибудь есть совет, как настроить UIPageViewController таким образом, чтобы я мог получить доступ к подвиду IBOutlets?

У меня были проблемы в других приложениях, обновляющих просмотры страниц, которые не видны на экране (например: обновление представления в vc3, когда vc1 на экране). UIPageViewController плохая идея для такой цели? Должен ли я просто сделать одно большое представление, через которое пользователь может перемещаться?

// UIPageViewController.swift

var vc1: ViewController1 = {
  let storyboard = UIStoryboard(name: "Main", bundle: nil)
  return (storyboard.instantiateViewController(withIdentifier: "ViewController1") as? ViewController1)!
}()

var vc2: ViewController2 = {
  let storyboard = UIStoryboard(name: "Main", bundle: nil)
  return (storyboard.instantiateViewController(withIdentifier: "ViewController2") as? ViewController2)!
}()

var vc3: ViewController3 = {
  let storyboard = UIStoryboard(name: "Main", bundle: nil)
  return (storyboard.instantiateViewController(withIdentifier: "ViewController3") as? ViewController3)!
}()

func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
  if viewController == vc2 {
    return vc1
  } else if viewController == vc3 {
    return vc2
  }
  return nil
}

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
  if viewController == vc1 {
    return vc2
  } else if viewController == vc2 {
    return vc3
  }
  return nil
}

  func viewDidLayoutSubviews() {
    // Adding observer for ViewController1
    NotificationCenter.default.addObserver(self, selector: #selector(vc1.handleEventDataChange), name: .eventDataChanged, object: nil)
  }

-

// ViewController1.swift

@IBOutlet weak var scoreBoard: UIView!

func viewDidLoad() {
  super.viewDidLoad()
}

func handleEventDataChange() {
  if scoreBoard.alpha != 0 { // <-- Crash here
    // update scoreboard
  }
} 

EDIT:

В дополнение к ответу JRTurton я также обнаружил, что добавляю наблюдателей не в тот класс.

NotificationCenter.default.addObserver(self, selector: #selector(vc1.handleEventDataChange), name: .eventDataChanged, object: nil)

должно быть

NotificationCenter.default.addObserver(vc1, selector: #selector(vc1.handleEventDataChange), name: .eventDataChanged, object: nil)

1 Ответ

0 голосов
/ 08 января 2019

Вы загружаете свои контроллеры представления из раскадровок, поэтому розетки будут подключены (при условии, что все они правильно подключены в раскадровке).

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

Внешне вызываемые функции, которые оказывают побочные эффекты на розетки, вероятно, должны начинаться с проверки isViewLoaded, чтобы предотвратить эту проблему. В идеале вы должны сконфигурировать объекты модели для передачи вашему контроллеру представления, на который контроллер представления может либо воздействовать немедленно (если представление загружено), либо использовать для конфигурации на viewDidLoad

(Кроме того, view сделал макет подвидов - не лучшее место для добавления наблюдателей - его можно назвать lot )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...