我使用的是 Xcode 8 和 Swift,而不是使用 Storyboard。
我点击“Add”->“Cocoa Touch Class”并选中该框以生成 XIB。
我现在有了 FooViewController.swift 和 FooViewController.xib。 xib 在文件所有者下设置了类。据我所知,这是 XIB 和类(class)之间的唯一关联。生成的类不包含任何加载 XIB 的内容。
我可以像这样创建并显示这个 View Controller (来自其他一些 ViewController):
let foo = FooViewController();
self.navigationController!.pushViewController(foo, animated: true);
这可以工作并且它可以与 UI 一起加载。我不明白的是为什么。大多数在线指南和教程都建议 ViewController 需要手动加载 XIB。
- FooViewController 的默认初始化程序中发生了什么?
- XIB 加载发生在哪里?
- 如果我想覆盖它并自己加载 XIB 怎么办? (例如,也许我想为不同的设备使用不同的 XIB。我知道这不是最佳实践,只是一个例子。)
最佳答案
从 Xcode 4.5 中我们用来创建通用应用程序的那一天开始,即 对于
- iPhone
- iPad
AppDelegate 类中的 didFinishLaunchingWithOptions
中曾经有代码为目标设备加载不同的 XIB,因此它的作用与您上面的要求相同。但考虑到 Xcode 和 Cocoa Framework 的演变。与编译器自动为我们做很多事情相比,它已经取得了很大的进步。
在这个特定场景中:
- 我们已经向 XIB 文件提供了文件所有者,因此当您尝试呈现它时,它会继续在可用的导航器/文件中搜索是否有可用的 XIB,如果找到这样的文件,则会加载
UINib
从 bundle 中加载并加载 - 如果没有,则进入代码查找是否有
当我们执行
super.viewDidLoad()
时正在创建编程 View 一旦找不到任何内容,它就会为同一 View Controller 生成一个空白 View 。
如果我们仔细观察 XIB 文件,会发现 XIB 中有一个与主视图相连的 View 导出,但我们没有创建这样的导出,因此它将 VC 源文件的自动生成导出与 XIB 中的 View 连接起来。如果有道理的话。
另外,请在下面找到一些代码以供 tableView Context 引用:
let newAccountTableCellNib:UINib = UINib(nibName: "AccountTableCell", bundle: nil)
tableView.registerNib(self.newAccountTableCellNib, forCellReuseIdentifier: "AccountTableCell")
这应该可以解决您的疑问。干杯!!
关于ios - .xib 文件如何自动关联并加载到我的 ViewController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40305127/