gpt4 book ai didi

ios - 通过 Storyboard 进行快速初始化

转载 作者:搜寻专家 更新时间:2023-11-01 06:03:25 29 4
gpt4 key购买 nike

我是一位语言入门的新手,我对类的初始化有疑问。

当您使用空的ViewController启动新项目时,如下所示:

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
}
}

由于 ViewControllerUIViewController的子类,并且具有指定的初始化程序 init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?)。运行代码时,“谁”将参数放入初始化程序中?是情节提要吗?

如果是这样,那么如果我的 ViewController中有一个存储的属性,需要指定的初始化程序来初始化我的存储属性,这会导致初始化过程中断,这意味着情节提要不再有义务初始化给你的 ViewController

最佳答案

我知道这对于初学者来说是一种误导,但是在这种情况下,初始化程序是而不是任何人调用的。您谈论的ViewController实例位于情节提要文件中,这将导致我稍后进入的初始化路径。如果您在其他地方以编程方式创建ViewController并从应用程序捆绑包中为其分配特定的笔尖,则可以使用您提到的方法。

各种模板都依赖于最终由运行时系统启动应用程序时完成的应用程序过程:
应用启动时,它会查看其Info.plist以确定最初要加载的故事板。在各种Xcode模板中,通常是Main.storyboard(然后指定ViewController类型的初始视图控制器)。您的项目不会像“生成的代码”那样执行此操作,因为Application对象可以执行此操作。在Objective-C项目中,您实际上可以看到这一点,因为入口点是常规的旧main方法(在main.m中)。 Swift运行时不显示此内容,它是您的应用程序使用的链接框架的一部分。

为此,现在非常重要的是要了解情节提要(以及与此相关的xib文件)的工作方式:
它们与应用程序使用常规指定的初始化程序创建各种对象的“配方”不同。它们实际上包含已经创建的对象(以序列化形式)。这意味着当您编译您的应用程序时,就会创建ViewController并将其“存档”到情节提要/ xib中。在这一点上,它无法知道与情节提要/ xib中其他对象的各种连接,因为在构建上述情节提要的过程中它是(这就是为什么您无法对init中的出口进行有意义的操作,这些对象不一定要创建)。
仅在完成此创建和存档后,各种连接才会(也)保存/添加到情节提要/ xib中。

现在,如果您启动了已编译的应用程序,并且加载了Main.storyboard中指定的Info.plist,并且该应用程序从中取消存档初始视图控制器。为此,它不使用您提到的initViewController方法,而是使用其对应的init(coder:)。之后,它将各种出口和动作与从情节提要(或场景)中未存档的其他相关对象连接起来。然后,它加载视图,这导致对viewDidLoad的调用。这也解释了为什么只能对在那里加载了故事板的视图控制器执行任何相关的初始化操作,而不能使用init进行初始化。

现在,最后,您的问题是:您根本无法拥有依赖于在运行时期间调用的初始视图控制器的指定初始化程序的属性。事实并非如此。这也是大多数ViewController实现不覆盖init的原因,您几乎没有什么可以做的。您可以使用三个选项来初始化任何东西:

  • 覆盖init(coder:)。请注意,您不一定知道故事板或场景中的哪些其他对象尚未归档,并且尚未建立连接,因此您只能在此处进行不需要这些对象的操作。
  • 实现awakeFromNib。在取消存档并建立到其他未存档对象的所有连接后立即从xib(并通过扩展情节提要图板场景)加载的任何对象都需要调用此方法。请注意,对于不是从故事板上未存档但在运行时以编程方式实例化的ViewControllers而言,情况并非如此。还有一些其他警告。
  • 初始化viewDidLoad中所需的所有内容。仅在实际加载ViewController的视图时(即通常在将要显示该视图时)才调用此方法,但是我猜总是这样。通常我会这样做。

  • 如果您遇到某种情况,必须在指定的初始化程序中初始化某些内容,并想知道为什么从情节提要中加载视图控制器时为什么缺少该内容,请不要忘记在init中的init(coder:)中以及可能在encode(encoder:)中执行的操作也一样我很少有这样的情况。为了更详细地说明何时以及如何完成此操作,我需要您提供更多信息,以了解您认为必须在init中完成哪些操作。在我的头顶上,我可以想到添加到情节提要场景中的自定义视图(而不是视图控制器),但是这个答案已经足够长了...

    关于ios - 通过 Storyboard 进行快速初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43892531/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com