【问题标题】:Rename XIB file without loosing outlet connection在不丢失出口连接的情况下重命名 XIB 文件
【发布时间】:2019-03-15 11:15:31
【问题描述】:

首先,我选择不使用情节提要,因为我已经习惯了只使用代码(我来自 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 文件而不必重新创建另一个视图控制器文件?

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

谢谢

【问题讨论】:

  • 如果您使用的是 xib 文件,则不是在代码中执行此操作。故事板就像多个连接的 xib 文件(还有一个额外的好处是您不必担心文件的所有者) - 与 HTML 无关
  • 那是另一个问题,但为什么我不使用故事板是因为我喜欢尽可能多地编写低级代码。另外,如果故事板是连接视图,为什么我的所有应用程序都不是一个故事板?说这个视图进入这个 storyboard1 和这个视图在 SB2 中的标准是什么?
  • 如果你想在代码中完成这一切,那么不要使用 xib 文件。如果你想使用 xib 文件,那么你没有在代码中这样做,所以你应该使用故事板。
  • 如何拆分故事板取决于您,并且取决于用例。您可以将您的注册流程放在一个故事板中,将您的设置屏幕放在另一个故事板中,等等。您可以将所有视图放在一个故事板中,或者每个视图有一个故事板……这取决于您。故事板引用可用于在故事板之间提供“链接”。

标签: ios xcode uiviewcontroller xib


【解决方案1】:

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

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

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

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

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

    1234563 .
  1. 它查找名称与视图控制器类的名称匹配的 nib 文件。例如,如果类名是MyViewController,它会查找MyViewController.nib 文件。

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

  1. 您将 nib 名称传递给 UIViewController.init(nibName:bundle:) 初始化程序,但该 nib 名称不正确。

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

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

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

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

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

【讨论】:

  • 感谢您的回答!我没有提到我如何在 AppDelegate.swift 中调用 viewcontroller:window?.rootViewController = IntroViewController()。这是在开始时调用 ViewController “Intro”。执行 UIViewController.init() 时,如何快速“知道”要调用什么视图控制器?我试图这样放置参数: IntroViewController(nibName:"IntroView") 但没有构造函数。
  • (我找到了它:IntroViewController.init(nibName : "IntroLayout", bundle:nil))无论如何,感谢您抽出宝贵时间回答:)
  • 谢谢,原来有必要重命名 xib 文件 )))
猜你喜欢
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2021-05-26
  • 2021-09-12
相关资源
最近更新 更多