You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Storyboard底层工作机制及与自定义ViewController类关联原理

Storyboard与自定义ViewController的关联机制解析

场景复现

我删除了Target、项目及Info.plist中所有「Main」相关配置,在SceneDelegate中通过以下代码设置根ViewController:

guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(windowScene: windowScene)
window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Dad")
window?.makeKeyAndVisible()

同时在Storyboard的Identity Inspector中,将对应ViewController的自定义类指定为ViewController,类代码如下:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .brown
    }
}

运行后界面背景显示为棕色,由此产生以下疑问:

疑问解答

  1. 从Storyboard初始化根ViewController时,系统如何知道要设置棕色背景?
    当你调用instantiateViewController(withIdentifier:)时,系统会创建你在Storyboard中指定的ViewController类的实例。这个实例会遵循ViewController的生命周期流程,当它的视图加载完成后,viewDidLoad方法会自动执行——而你在这个方法里写了view.backgroundColor = .brown,所以系统就会把视图背景设置成棕色。

  2. 自定义类与Storyboard的底层交互机制是怎样的?

  • Storyboard本质是XML格式的文件,里面记录了每个界面元素(比如ViewController、View)的属性、标识符,以及关联的自定义类名等信息。
  • 初始化UIStoryboard对象时,系统会解析这个XML文件,把里面的配置信息加载到内存中。
  • 调用instantiateViewController(withIdentifier:)时,系统会根据传入的ID找到对应的XML条目,取出记录的类名,通过Runtime机制创建该类的实例。
  • 接着系统会把Storyboard中定义的视图层级结构,加载到这个ViewController实例的view属性中。
  • 最后按照ViewController的生命周期流程,依次触发viewDidLoad等方法,执行你在自定义类中编写的代码逻辑。
  1. 类中的代码是否会写入nib文件?
    不会。nib/Storyboard文件只负责存储界面布局信息、控件属性、对象关联关系(比如指定绑定的类名)等静态配置,是纯XML文本文件。而自定义类的代码会被编译成二进制指令,存储在App的可执行文件里。两者完全分离,Storyboard只是在运行时通过记录的类名,找到对应的代码类来实例化对象。

内容的提问来源于stack exchange,提问作者Alisher Baigazin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 00:40:29