重命名XIB文件而不会丢失插座连接

时间:2018-10-10 13:59:26

标签: ios xcode uiviewcontroller xib

首先,我选择不使用情节提要,因为我习惯于仅使用代码(我来自Java)。所以这是我不了解的行为:

1 /我创建了一个.xib文件,其中包含一个视图,可以说是一个按钮。

2 /我创建了一个ViewController(据我了解:一个包含许多子视图的xib文件与一个viewController相关联)

3 /我将xib的文件所有者设置为viewcontroller类

4 /我通过拖放xcode的“魔术”在按钮和ViewController之间建立插座连接。

这里一切正常:在我的ViewDidLoad()开头,当我运行应用程序时,插座被设置为UIButton,并且我可以使用它

5 /我重命名 xib文件

6 / 当我在ViewDidLoad()开始时运行应用程序时,插座为零。。那是问题。

我不明白为什么。该文件的xib所有者仍然相同,仍然是我的viewcontroller.swift(我没有重命名viewcontroller类,而只是重命名了xib),所以为什么该viewcontroller无法通过搜索现在拥有的xib看到他的视图?我试图清理该项目,将其关闭,甚至重新启动我的笔记本电脑,也没有任何改变。.我可能错过了一些东西,因为它不能正常重命名xib文件而不必重新创建另一个viewcontroller文件是不正常的吗?

我绝对不习惯使用图形界面,我很高兴看到很多开发人员也不是。您能否建议我一些技巧,以创建没有情节提要的应用程序,仅使用xib之类的“ HTML”文件以及代码中的所有其他内容?

谢谢

1 个答案:

答案 0 :(得分:2)

xib中文件所有者占位符的自定义类仅具有一种效果:它告诉Interface Builder(Xcode的xib编辑器部分)在文件所有者占位符上提供哪些输出和操作。文件所有者的自定义类不会影响您的视图控制器在运行时查找其nib文件的方式。

(xib文件是您在Interface Builder中编辑的基于XML的文档; nib文件是xib文件的编译版本,包含在您的应用捆绑包中。)

The UIViewController.nibName documentation告诉您您需要了解的内容:

  

此属性包含在初始化时为initWithNibName:bundle:方法指定的值。此属性的值可以为nil

     

如果使用nib文件存储视图控制器的视图,建议在初始化视图控制器时明确指定该nib文件。但是,如果未指定笔尖名称,并且未在自定义子类中覆盖loadView方法,则视图控制器会使用其他方式搜索笔尖文件。具体来说,它将查找具有适当名称(不带.nib扩展名的nib文件),并在请求其视图时加载该nib文件。具体来说,它查找(按顺序)具有以下名称之一的nib文件:

     
      
  1. 如果视图控制器类名以单词'Controller'结尾,如MyViewController,它将寻找一个与该类名匹配且没有单词'Controller'的nib文件,如{ {1}}。

  2.   
  3. 它将查找其名称与视图控制器类名称匹配的nib文件。例如,如果类名称为MyView.nib,则它将查找MyViewController文件。

  4.   

因此,如果您已重命名xib,而现在的出口为nil,则由于以下一个或多个原因,您的视图控制器可能根本不加载nib文件:< / p>

  1. 您将一个笔尖名称传递给了MyViewController.nib初始化程序,而该笔尖名称不正确。

  2. 您将nil传递给了UIViewController.init(nibName:bundle:)初始化程序,UIViewController.init(nibName:bundle:)文档中描述的命名规则均与您重命名的xib文件名不符。

以下是一些可能的解决方案:

  1. 将重命名的xib文件名(不带nibName扩展名)传递给.xib初始化程序。

  2. 覆盖UIViewController.init(nibName:bundle:)子类中的nibName属性,以返回重命名的xib文件名(不带UIViewController扩展名)。

  3. 重命名xib文件以匹配.xib文档中描述的规则之一。