Swift:当以编程方式创建拆分视图控制器

时间:2017-03-27 15:34:08

标签: ios swift uisplitviewcontroller

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

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时,我得到错误:'致命错误:在解包一个可选值时意外发现nil',它似乎链接到RootTableViewController上的UITextField(以及所有UI元素)。在将值传递给ui元素时执行上述代码后,第一个失败是在RootViewController的viewDidLoad中

Error Message on UITextField

1 个答案:

答案 0 :(得分:0)

这究竟发生在哪里?这个错误起源了吗?我有一个类似的问题,我试图访问IBOutlets之前系统创建它导致我的应用程序崩溃。

具体来说,我有一个UI更新功能,在设置ViewController的属性后调用。

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

<强>更新

我想我知道最近会发生什么。您创建了一个Storyboard,设置了UI并选择了ViewControllers作为Storyboard中ViewControllers的类。

如果你现在想要使用ViewControllers,你必须通过Storyboard实例化它们,而不是手动初始化它们(如下所示):

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

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

我能想到的最后一个方法是,如果你想手动实例化ViewControllers并仍然使用Storyboard或nib,你必须在ViewControllers的init函数中进行一些自定义初始化(这段代码)来自我在单独的.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
}
相关问题