.xib文件如何与我的ViewController自动关联并加载?

时间:2016-10-28 12:28:30

标签: ios iphone swift xcode cocoa-touch

我正在使用Xcode 8和Swift,而不是使用Storyboard。

我点击Add-> Cocoa Touch Class并选中该框以生成XIB。

我现在有FooViewController.swift和FooViewController.xib。 xib具有在文件所有者下设置的类。据我所知,这是XIB和班级之间的唯一关联。生成的类不包含任何加载XIB的内容。

我可以像这样创建和显示这个视图控制器(来自其他一些ViewController):

let foo = FooViewController();
self.navigationController!.pushViewController(foo, animated: true);

这很有效,它可以加载UI。我不明白的是为什么。大多数在线指南和教程都表明ViewController需要手动加载XIB。

  • FooViewController的默认初始化程序中发生了什么?
  • XIB加载发生在哪里?
  • 如果我想覆盖它并自己加载XIB怎么办? (例如,我可能想为不同的设备使用不同的XIB。不是最好的做法,我知道,只是一个例子。)

1 个答案:

答案 0 :(得分:0)

从我们用于创建通用应用程序的Xcode 4.5中的那一天开始,即 对

  1. iPhone
  2. ipad公司
  3. AppDelegate Class中的didFinishLaunchingWithOptions中曾经存在代码,用于为目标设备加载不同的XIB,因此它的行为与您上面提到的相同。但鉴于Xcode和Cocoa Framework的发展。它已经走了很长的路,编译器会自动为我们做很多事情。

    此特定情况:

    1. 我们已经将文件所有者提供给XIB文件,因此当您尝试呈现它时,它会继续并在导航器/文件中搜索可用的XIB,如果它找到这样的文件,它会加载来自捆绑包的UINib并加载它
    2. 如果没有,则转到代码中查找是否有 在我们super.viewDidLoad()的同时创建程序化视图 一旦找不到任何内容,它就会为同一个视图控制器生成一个空白视图。
    3. 如果我们仔细查看XIB文件,可以在XIB中找到附带主视图的视图插座,但是我们没有创建这样的插座,因此它将VC Source文件的自动生成插座与XIB中的视图连接起来。如果有意义的话。

      另请参阅下面的代码以供tableView上下文参考:

      let newAccountTableCellNib:UINib = UINib(nibName: "AccountTableCell", bundle: nil)
      tableView.registerNib(self.newAccountTableCellNib, forCellReuseIdentifier: "AccountTableCell")
      

      这应该可以解决您的疑问。干杯!!