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 视图?

Swift:无法从 xib 访问子视图

iOS 自定义 .xib 视图按钮点击检测在视图控制器 (Swift)

如何使 xib 子视图与 Swift 中的超级视图交互?

Swift项目,适配遇到的问题

iOS 8 xib + AutoLayout 无法为 tableViewHeaderView 正常工作