Я читаю, если вы создаете экземпляр класса (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)