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
}
我在触摸 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
}