代码之家  ›  专栏  ›  技术社区  ›  Jay Strawn

在uipageviewcontroller的子视图中引用“iboutlet”的方式`

  •  1
  • Jay Strawn  · 技术社区  · 6 年前

    如果你直接实例化一个类(uiviewcontroller),通过初始化器,iboutlets就不会被连接。我的问题是我引用的是零 IBOutlet 导致撞车。

    我有很多观察者在 vc1 , vc2 vc3 (页) UIPageViewController )为了保持代码的整洁,我希望在 uipageview控制器 而不是在 viewDidLoad 属于 VC1 , VC2 和; VC3 .

    但是,我不能引用 IBOutlets 的子视图 uipageview控制器 因为他们得了零分。有人对如何设置有什么建议吗 uipageview控制器 在某种程度上,我可以访问子视图 伊布斯特 ?

    我在更新屏幕上看不到的页面视图时遇到了问题,(例如:更新中的视图) VC3 虽然 VC1 在屏幕上。是 uipageview控制器 这类目标的坏主意?我应该只制作一个用户可以浏览的大视图吗?

    // 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
      }
    } 
    

    编辑:

    除了jrterton的答案,我还发现我在错误的类中添加了观察者。

    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 回复  |  直到 6 年前
        1
  •  2
  •   jrturton    6 年前

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

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

    对出口有副作用的外部调用函数应该从检查 isViewLoaded 为了防止这个问题。理想情况下,您应该将模型对象配置为传递给视图控制器,视图控制器可以立即对其执行操作(如果加载了视图),也可以将其用于 viewDidLoad

    (此外,视图DID布局子视图不是添加观察者的好地方-可以称为 许多 )