在不丢失插座连接的情况下重命名 XIB 文件

Rename XIB file without loosing outlet connection

首先,我选择不使用故事板,因为我已经习惯了只使用代码(我来自 Java)。所以这是我不明白的行为:

1/ 我创建了一个包含视图和按钮的 .xib 文件。

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

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

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

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

5/我重命名 xib 文件

6/ 当我 运行 应用程序在 ViewDidLoad() 开始时,outlet 为 nil。就是这个问题。

我不明白为什么。 xib的文件属主还是原来的,还是我的viewcontroller.swift(我没有重命名viewcontroller class,只重命名了xib),为什么这个viewcontroller看不到通过搜索它现在拥有的xib,他的观点是什么??我试图清理项目,关闭它,甚至重新启动我的笔记本电脑,没有任何改变。我可能错过了一些东西,因为我不能重命名 xib 文件而不必重新创建另一个 viewcontroller 文件是不正常的?

我绝对不习惯使用图形界面,很高兴看到许多开发人员也不习惯。你能给我一些建议来创建一个没有故事板的应用程序,只使用像“HTML”这样的 xib 文件和代码中的所有其他东西吗?

谢谢

xib 中 File's Owner 占位符的自定义 class 只有一个作用:它告诉 Interface Builder(Xcode 的 xib 编辑器部分)在 File 上提供什么出口和操作所有者占位符。文件所有者的自定义 class 不会 影响您的视图控制器在运行时查找其 nib 文件的方式。

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

The UIViewController.nibName documentation告诉你你需要知道的:

This property contains the value specified at initialization time to the initWithNibName:bundle: method. The value of this property may be nil.

If you use a nib file to store your view controller's view, it is recommended that you specify that nib file explicitly when initializing your view controller. However, if you do not specify a nib name, and do not override the loadView method in your custom subclass, the view controller searches for a nib file using other means. Specifically, it looks for a nib file with an appropriate name (without the .nib extension) and loads that nib file whenever its view is requested. Specifically, it looks (in order) for a nib file with one of the following names:

  1. If the view controller class name ends with the word ‘Controller’, as in MyViewController, it looks for a nib file whose name matches the class name without the word ‘Controller’, as in MyView.nib.

  2. It looks for a nib file whose name matches the name of the view controller class. For example, if the class name is MyViewController, it looks for a MyViewController.nib file.

所以,如果你重命名了你的 xib,而现在 outlet 是 nil,那么你的视图控制器可能 根本没有加载 nib 文件,因为一个或多个这些原因:

  1. 您将 nib 名称传递给 UIViewController.init(nibName:bundle:) 初始值设定项,但该 nib 名称不正确。

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

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

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

  2. 将你的 UIViewController subclass 中的 nibName 属性 覆盖为 return 重命名的 xib 文件名(没有 .xib扩展名).

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