向视图控制器添加初始化程序会导致 viewDidLoad 中的 outlet 为 nil

Posted

技术标签:

【中文标题】向视图控制器添加初始化程序会导致 viewDidLoad 中的 outlet 为 nil【英文标题】:Adding an initializer to a view controller results in an outlet being nil in viewDidLoad 【发布时间】:2016-11-14 23:39:04 【问题描述】:

我有一个视图控制器如下:

   class TutorialPageViewController: UIViewController, UIPageViewControllerDelegate
    
        @IBOutlet weak var pageControl: UIPageControl!
        var tutorialCategory    = TutorialCategory.enableShareContact

        override func viewDidLoad()
        
            super.viewDidLoad()
            self.pageViewController.dataSource = self
            self.pageViewController.delegate = self
            pageControl.numberOfPages  = 5

   ...

这运行没有问题,但是在添加初始化程序后,pageControl 出口现在在 viewDidLoad 中为零,导致异常。这是添加的初始化程序:

init(tutorialCategory: TutorialCategory)

    super.init(nibName: nil, bundle: nil)
    self.tutorialCategory = tutorialCategory


convenience required init(coder aDecoder: NSCoder)

    self.init(tutorialCategory: TutorialCategory.enableShareContact)
 

为什么添加初始化程序具有使 IBOutlet 现在变为 nil 的效果,我该如何解决?

(我尝试在 viewDidLoad 中添加对 VC 视图的调用以尝试强制加载插座,但没有效果)

【问题讨论】:

【参考方案1】:

因为插座是由super.init(coder aDecoder: NSCoder) 设置的,您不再调用它。

你可能想要:

required init(coder aDecoder: NSCoder) 
    self.tutorialCategory = .enableShareContact
    super.init(coder: aDecoder)

不要把它作为一个方便的初始化来覆盖它。

【讨论】:

以上是关于向视图控制器添加初始化程序会导致 viewDidLoad 中的 outlet 为 nil的主要内容,如果未能解决你的问题,请参考以下文章

呈现视图控制器并添加子视图控制器导致应用程序冻结

向 models.py 添加一个类会导致“视图不存在”错误吗?

向 UITableViewController 添加顶部/底部视图?

与导航控制器基础知识斗争

UIPageViewController - 添加的子视图会导致第一个控制器视图中的错误 - 其他控制器很好

必须使用延迟实例化的UI视图将子视图添加到视图控制器两次