在不丢失插座连接的情况下重命名 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:
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
.
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 文件,因为一个或多个这些原因:
您将 nib 名称传递给 UIViewController.init(nibName:bundle:)
初始值设定项,但该 nib 名称不正确。
您将 nil 传递给了 UIViewController.init(nibName:bundle:)
初始化程序,并且 nibName
文档中描述的命名规则的 none 与您重命名的 xib 文件名匹配。
以下是一些可能的解决方案:
将重命名的 xib 文件名(不带 .xib
扩展名)传递给 UIViewController.init(nibName:bundle:)
初始化程序。
将你的 UIViewController
subclass 中的 nibName
属性 覆盖为 return 重命名的 xib 文件名(没有 .xib
扩展名).
重命名 xib 文件以匹配 nibName
文档中描述的规则之一。
首先,我选择不使用故事板,因为我已经习惯了只使用代码(我来自 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 benil
.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:
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 inMyView.nib
.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 aMyViewController.nib
file.
所以,如果你重命名了你的 xib,而现在 outlet 是 nil,那么你的视图控制器可能 根本没有加载 nib 文件,因为一个或多个这些原因:
您将 nib 名称传递给
UIViewController.init(nibName:bundle:)
初始值设定项,但该 nib 名称不正确。您将 nil 传递给了
UIViewController.init(nibName:bundle:)
初始化程序,并且nibName
文档中描述的命名规则的 none 与您重命名的 xib 文件名匹配。
以下是一些可能的解决方案:
将重命名的 xib 文件名(不带
.xib
扩展名)传递给UIViewController.init(nibName:bundle:)
初始化程序。将你的
UIViewController
subclass 中的nibName
属性 覆盖为 return 重命名的 xib 文件名(没有.xib
扩展名).重命名 xib 文件以匹配
nibName
文档中描述的规则之一。