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。
示例步骤:
- 先在Storyboard里给
SettingsViewController设置Restoration ID(可以设成"RestorableSettingsVC",也可以和Storyboard ID一样,不冲突)。 - 在
AppDelegate里开启状态恢复的权限:
func application(_ application: UIApplication, shouldSaveApplicationState coder: NSCoder) -> Bool { return true // 允许APP保存状态 } func application(_ application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool { return true // 允许APP恢复状态 }
- 在
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
相关产品推荐
相关产品推荐

