Swift 如何在“UIPageViewController”的子视图中引用“IBOutlet”`

Swift 如何在“UIPageViewController”的子视图中引用“IBOutlet”`,swift,instantiation,uipageviewcontroller,iboutlet,Swift,Instantiation,Uipageviewcontroller,Iboutlet,我了解到,如果您通过初始值设定项直接实例化一个类(UIViewController),则不会连接IBOutlets。我的问题是我引用了一个nilIBOutlet,导致了崩溃 我有很多观察者更新vc1、vc2和vc3(UIPageViewController中的“页面”)中的视图。为了保持代码干净,我想在UIPageViewController类中添加所有观察者,而不是在vc1、vc2、&vc3的viewDidLoad中添加观察者 但是,我无法从UIPageViewController中引用子视图

我了解到,如果您通过初始值设定项直接实例化一个类(UIViewController),则不会连接IBOutlets。我的问题是我引用了一个nil
IBOutlet
,导致了崩溃

我有很多观察者更新
vc1
vc2
vc3
(UIPageViewController中的“页面”)中的视图。为了保持代码干净,我想在
UIPageViewController
类中添加所有观察者,而不是在
vc1
vc2
、&
vc3
viewDidLoad
中添加观察者

但是,我无法从
UIPageViewController
中引用子视图的
IBOutlets
,因为它们的值为零。关于如何设置
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)
  }
-

应该是

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

您正在从故事板加载视图控制器,因此插座将连接起来(假设它在故事板中正确连接)

问题最可能的原因是在视图控制器加载其视图之前调用了这些方法,因此它们还没有机会连接任何东西

对插座有副作用的外部调用函数可能应首先检查
isViewLoaded
,以防止出现此问题。理想情况下,您应该配置模型对象以传递给视图控制器,视图控制器可以立即对其进行操作(如果加载了视图),也可以在
viewdiload

(另外,视图did布局子视图不是添加观察者的好地方-这可能会被称为很多)

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