iOS8 Swift 无法使用 xib 创建视图控制器
Posted
技术标签:
【中文标题】iOS8 Swift 无法使用 xib 创建视图控制器【英文标题】:iOS8 Swift can't create view controller with xib 【发布时间】:2016-08-24 08:30:14 【问题描述】:我正在使用 Swift,并且正在修复 ios 8 的一些错误。我使用 .xib 创建了一个视图控制器。例如,一个视图控制器和其中的一个表视图。
这就是我创建 .xib 文件的方式。
1.我把一个tableView拖到视图中 2.设置文件所有者的类 3.把视图拖到文件所有者 4.把tableView拖到文件所有者@ 987654324@ 我在文件的所有者中有这个代码
class BicycleServiceInfoController: UIViewController, UITableViewDelegate, UITableViewDataSource
@IBOutLet tableView: UITableView!
override func viewDidLoad()
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
//other functions
...
但是当我在 iOS 8.4 中运行这个 APP 并尝试呈现这个视图控制器时,它会崩溃。 Xcode 说“在展开可选值时意外发现 nil”。这是因为 tableView 在这段代码中是 nil 。但它在 iOS 9 中运行良好。
有人可以帮助我吗?
【问题讨论】:
你如何创建视图控制器本身? 【参考方案1】:override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)
let classString = String(describing: type(of: self))
if Bundle.main.path(forResource: classString, ofType: "nib") == nil
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
else
super.init(nibName: nibNameOrNil ?? classString, bundle: nibBundleOrNil)
required init?(coder aDecoder: NSCoder)
fatalError("init(coder:) has not been implemented")
iOS 8 需要调用此方法,iOS 9 或更高版本,系统修复了此问题。 你可以得到答案here
【讨论】:
只有我一个人,还是右括号太多?还是格式有那么糟糕? 这是正确的答案。修复问题。谢谢!【参考方案2】:Tonin 已经提供了正确的答案,但对于所有努力将其转换为 Swift 2.3 的人来说,这里就是:
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)
let classString = String(MyClassName)
if NSBundle.mainBundle().pathForResource(classString, ofType: "nib") == nil
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
else
super.init(nibName: nibNameOrNil ?? classString, bundle: nibBundleOrNil)
required init?(coder aDecoder: NSCoder)
fatalError("init(coder:) has not been implemented")
【讨论】:
【参考方案3】:在viewWillAppear
函数中设置委托。或者在界面生成器中。
iOS 8 在创建屏幕时会出现一些问题。
【讨论】:
以上是关于iOS8 Swift 无法使用 xib 创建视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中以编程方式从 MainViewController 切换到 .xib 视图?