首页 > 解决方案 > 快速实例化 UIViewController

问题描述

假设我有自定义视图控制器,它们有自己的 .xib 文件设置正确。

我也有这个扩展

class func fromNib<T: UIViewController>() -> T
{
    return T(nibName: String(describing: T.self), bundle: nil)
}

让我们调用我们的自定义 UIViewController VC

let customVC    = VC()
let customVC:VC = .fromNib()

前两种方法之间的主要区别是什么?有趣的是,我同时使用了它们,并且都有效,但并非总是如此,也并非对所有人都适用。使用第一种方法,我设法发现,每当您将控制器添加为子级时,它的 loadView 和生命周期就会开始。使用第二种方法,您必须实现以下两件事:

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)
required init?(coder aDecoder: NSCoder)

我尝试用第一种方法替换曾经拥有 .fromNib 的所有内容,以便跳过实现上面的那些方法,而只是在 viewDidLoad 中执行所有操作。

为什么第一种方法对某些控制器来说完美无缺,而对另一些控制器来说,插座没有连接?

标签: iosswift

解决方案


没关系,我发现了这个错误。我在 loadView 中的某些控制器中使用了插座而不是 viewDidLoad,而 loadView 内部的插座为零。我真蠢。PS:第一种方法确实适用于 .xib 文件。我知道从代码到 .xib 文件没有连接,我猜 xcode 只知道您的 ViewController 是 .xib 文件的所有者并自动加载它。


推荐阅读