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

人盡茶涼 提交于 2019-12-25 18:25:30

问题


I am programmatically creating a split view controller using the following code when a table view cell is touched:

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)

but when I tap the tableViewCell I get the error: 'fatal error: unexpectedly found nil while unwrapping an Optional value' which appears to be linked to a UITextField (and all UI Elements) on the RootTableViewController. The first failure is in the viewDidLoad of RootViewController after executing the above code when a value is passed to a ui element


回答1:


Where exactly does this happen? Wheres the error originated? I had a similar issue where I tried to access IBOutlets before they were created by the system which caused my app to crash.

Specifically I had a UI update function which was called after setting a property of the ViewController.

I got around this by checking for nil in the update function and since it was called before viewDidLoad was called the first time, I called the update function in viewDidLoad manually to make sure that when it shows for the first time, everything is correctly updated.

UPDATE

I think I have an idea of whats going on. You created a Storyboard, setup your UI and chose your ViewControllers as the classes of the ViewControllers in the Storyboard.

If you now want to use the ViewControllers, you have to instantiate them via the Storyboard rather than manually initializing them (something like this):

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

You also could use Segues instead of instantiating something at all. Build your complete UI using the Storyboard and then use a Segue to present the SplitViewController.

The last method I can think of is, that if you want to instantiate the ViewControllers manually and still make use of the Storyboard or a nib, you have to do some custom initialization in in the init functions of your ViewControllers (this code is from a custom view I have in a separate .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
}


来源:https://stackoverflow.com/questions/43050621/swift-ui-elements-equal-nil-when-programatically-creating-split-view-controller

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!