Swift:UI 以编程方式创建拆分视图控制器时,元素等于 nil

Swift: UI Elements equal nil when programatically creating split view controller

我在触摸 table 视图单元格时使用以下代码以编程方式创建拆分视图控制器:

let rootViewController: UIViewController = RootTableViewController()
        let navVC: UINavigationController = UINavigationController(rootViewController: rootViewController)

        let detailViewController: UIViewController = DetailTableViewController()

        let splitVC: UISplitViewController = UISplitViewController()
        splitVC.viewControllers = [navVC, detailViewController]
        self.present(splitVC, animated: true, completion: nil)

但是当我点击 tableViewCell 时出现错误:'fatal error: unexpectedly found nil while unwrapping an Optional value' 似乎链接到 UITextField(以及所有 UI 元素) RootTableViewController。当一个值被传递给一个 ui element

时,第一个失败是在执行上述代码后 RootViewController 的 viewDidLoad

具体发生在什么地方?错误起源于何处?我有一个类似的问题,我试图在系统创建 IBOutlets 之前访问它们,这导致我的应用程序崩溃。

具体来说,我有一个 UI 更新函数,它是在设置 ViewController 的 属性 之后调用的。

我通过检查更新函数中的 nil 来解决这个问题,因为它是在第一次调用 viewDidLoad 之前调用的,所以我手动调用了 viewDidLoad 中的更新函数,以确保当它第一次显示时,一切都已正确更新。

更新

我想我知道发生了什么。您创建了一个故事板,设置了您的 UI 并选择了您的 ViewController 作为故事板中 ViewController 的 类。

如果您现在想使用 ViewControllers,您必须通过 Storyboard 实例化它们,而不是手动初始化它们(像这样):

let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "someViewController")

您也可以使用 Segues 而不是完全实例化某些东西。使用 Storyboard 构建完整的 UI,然后使用 Segue 呈现 SplitViewController。

我能想到的最后一个方法是,如果你想手动实例化 ViewControllers 并且仍然使用 Storyboard 或 nib,你必须在 init 中做一些自定义初始化ViewControllers 的功能(此代码来自我在单独的 .xib 中的自定义视图):

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    initializeSubviews()
}

override init(frame: CGRect) {
    super.init(frame: frame)
    initializeSubviews()
}

func initializeSubviews() {
    UINib(nibName: "DatePickerKeyboard", bundle: nil).instantiate(withOwner: self, options: nil)
    addSubview(view)
    view.frame = self.bounds
}