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

Xcode 9.2 Storyboard中Restoration ID的作用是什么?求示例

Storyboard ID vs Restoration ID:搞懂这俩的核心区别&实用示例

嘿,这个问题问得特别到位——我刚接触Storyboard的时候,也对着这两个ID愣了半天,总觉得长得像功能也应该差不多,结果实际用起来才发现完全是两码事😅。下面我用大白话+代码示例给你掰扯清楚:

一、Storyboard ID:用来「实例化控制器/视图」的标识

简单说,Storyboard ID就是给Storyboard里的ViewController(或者View)发一个“身份证”,方便你通过代码从Storyboard里把这个控制器的实例调出来。

什么时候用?

当你不想用Segue跳转,而是需要用代码手动创建某个Storyboard里的控制器时,必须给这个控制器设置Storyboard ID。

示例代码:

假设你在Main.storyboard里有个SettingsViewController,先在Identity Inspector里给它设置Storyboard ID为"SettingsVC"。然后在其他控制器里(比如Home页),用代码跳转到Settings页:

@IBAction func tapSettingsButton(_ sender: UIButton) {
    // 先获取对应的Storyboard实例
    let mainStoryboard = UIStoryboard(name: "Main", bundle: nil)
    // 通过Storyboard ID实例化目标控制器
    guard let settingsVC = mainStoryboard.instantiateViewController(withIdentifier: "SettingsVC") as? SettingsViewController else {
        print("找不到对应的控制器!")
        return
    }
    // 跳转(这里用导航栈push为例)
    navigationController?.pushViewController(settingsVC, animated: true)
}

二、Restoration ID:用来「恢复界面状态」的标识

这个ID和iOS的状态恢复(State Restoration)功能绑定,作用是让APP在被系统后台回收、或者用户重启APP后,能恢复到之前的界面,甚至还能保留当时的输入内容、滚动位置等状态。

什么时候用?

当你需要给用户提供“断点续用”的体验时,比如用户在填写表单时切到后台,APP被系统杀掉,再打开时能回到表单页面,并且之前输入的内容还在,这时候就需要用到Restoration ID。

示例步骤:

  1. 先在Storyboard里给SettingsViewController设置Restoration ID(可以设成"RestorableSettingsVC",也可以和Storyboard ID一样,不冲突)。
  2. 在AppDelegate里开启状态恢复的权限:
func application(_ application: UIApplication, shouldSaveApplicationState coder: NSCoder) -> Bool {
    return true // 允许APP保存状态
}

func application(_ application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool {
    return true // 允许APP恢复状态
}
  1. 在SettingsViewController里实现状态保存和恢复的方法:
class SettingsViewController: UIViewController {
    @IBOutlet weak var usernameTextField: UITextField!
    
    // 保存当前界面的状态
    override func encodeRestorableState(with coder: NSCoder) {
        super.encodeRestorableState(with: coder)
        // 把用户名输入框的内容存起来
        coder.encode(usernameTextField.text, forKey: "savedUsername")
    }
    
    // 恢复之前保存的状态
    override func decodeRestorableState(with coder: NSCoder) {
        super.decodeRestorableState(with: coder)
        // 取出之前保存的用户名,赋值给输入框
        if let savedName = coder.decodeObject(forKey: "savedUsername") as? String {
            usernameTextField.text = savedName
        }
    }
}

三、核心区别总结

  • Storyboard ID:负责「创建实例」——告诉系统“我要从Storyboard里拿出这个控制器的新实例”。
  • Restoration ID:负责「恢复状态」——告诉系统“当需要恢复界面时,找到这个ID对应的控制器,把之前保存的状态还给它”。
  • 两者可以设为相同的值,但逻辑上是完全独立的两个功能:你可以只设置Storyboard ID用来跳转,也可以只设置Restoration ID用来恢复状态(不过后者通常需要配合前者一起用)。

要是还有啥没搞明白的地方,随时问哈!

内容的提问来源于stack exchange,提问作者Videh Jaiswal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:59:50