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 } }
运行后界面背景显示为棕色,由此产生以下疑问:
疑问解答
从Storyboard初始化根ViewController时,系统如何知道要设置棕色背景?
当你调用instantiateViewController(withIdentifier:)时,系统会创建你在Storyboard中指定的ViewController类的实例。这个实例会遵循ViewController的生命周期流程,当它的视图加载完成后,viewDidLoad方法会自动执行——而你在这个方法里写了view.backgroundColor = .brown,所以系统就会把视图背景设置成棕色。自定义类与Storyboard的底层交互机制是怎样的?
- Storyboard本质是XML格式的文件,里面记录了每个界面元素(比如ViewController、View)的属性、标识符,以及关联的自定义类名等信息。
- 初始化
UIStoryboard对象时,系统会解析这个XML文件,把里面的配置信息加载到内存中。 - 调用
instantiateViewController(withIdentifier:)时,系统会根据传入的ID找到对应的XML条目,取出记录的类名,通过Runtime机制创建该类的实例。 - 接着系统会把Storyboard中定义的视图层级结构,加载到这个ViewController实例的
view属性中。 - 最后按照ViewController的生命周期流程,依次触发
viewDidLoad等方法,执行你在自定义类中编写的代码逻辑。
- 类中的代码是否会写入nib文件?
不会。nib/Storyboard文件只负责存储界面布局信息、控件属性、对象关联关系(比如指定绑定的类名)等静态配置,是纯XML文本文件。而自定义类的代码会被编译成二进制指令,存储在App的可执行文件里。两者完全分离,Storyboard只是在运行时通过记录的类名,找到对应的代码类来实例化对象。
内容的提问来源于stack exchange,提问作者Alisher Baigazin
相关产品推荐
相关产品推荐

