storyboard 上的view controller 和我通过代码定义的view controller 是什么关系?

What is the relationship between the view controller on the storyboard and view controller I define through code?

当我在 Interface Builder 中创建视图控制器时,我通过从 Identity Inspector 中选择适当的名称将其与我的 class 代码版本相关联。 IB 的视图控制器是我编码的 class 的子 class 吗?

据我所知,IB 中的视图控制器不是实例,因为您仍然需要实例化它:

if let vc = storyboard?.instantiateViewController(identifier: "Detail") as? DetailViewController {
 // use vc
}

我不认为它是视图控制器代码版本的属性,在上面的示例中是DetailViewController。它通过 storyboard 实例化,而 storyboard 又来自 UIStoryBoard.

Interface Builder (IB) 中的视图控制器不是您在 .swift 文件中定义的 class 的子 class。故事板实际上只是帮助您直观地定义 UIViewController 控制的子视图的布局和约束。

基本上您的代码片段所做的是“找到以 'Detail' 作为其标识符的故事板对象,确保其伙伴 class 的类型为 DetailViewController,然后创建一个DetailViewController 的实例,具有在该故事板对象中定义的布局和约束。

将情节提要视为 资源文件 instantiateViewController 只是 读取 该文件并通过调用其 init(coder:) 初始化程序创建某个 UIViewController 子类。之后,它会创建在故事板上找到的所有视图,并将其添加到 VC 的 view 中。 instantiateViewController 如何知道要创建哪个 UIViewController 子类?子类的名称实际上存储在故事板中,就在您在身份检查器中键入“DetailViewController”时!

您在 IB 中看到的视图控制器只是一个实例 JSON...

{
    "username": "Sweeper",
    "id": 5133585
}

是这个结构的一个实例:

struct User {
    let username: String
    let id: Int
}

它也不是 DetailViewController 的子类。它只是资源文件中的数据。

情节提要是场景的集合/vc通过 segue 相互关联的场景(如果存在),当您创建 vc 时,您可以选择完全以编程方式创建它它是布局或在故事板中创建它的布局,然后在身份检查器中分配 vc 名称,以便您使用它来创建 vc 的实例,其中 instantiateViewController 链接到指定的布局在故事板中没有超子类关系。 vc中的代码作为vc生命周期的系列。将 sotyboard 部分视为一种简单的方法,可以将带有约束的标签/按钮等布局组件添加到 vc 的视图,而不是以编程方式创建它们,这是主要区别