Swift使用编码器超越app close保存viewcontroller状态
我正在使用Xcode 8和swift 2.3
我想将整个视图控制器保存到文件并恢复状态,即使应用程序关闭后也是如此。 我到处搜索,发现我们需要使用编码器。 但所有只是节目保存对象。 但在这里我需要保存整个ViewContoller和子视图。
ViewCotroller将有三个按钮
- 添加文字
- 添加图片:用户可以添加任意数量的textViews和图像。 所以我还需要保存所有这些信息。
- 添加ViewController:用户可能拥有此viewController的数组,需要保存所有内容。
问题1)
可以保存self.view并自动保存所有子视图吗?
问题2)
我需要在开始时不使用编码器初始化
let nameVccVar = nameVcc()
和
let nameVccVar = nameVcc(coder: CodeVar)
问题3)
如何使用NSKeyedUnarchiver将所有这些编码数据保存到文件并检索回来?
请帮助我或给我提示使所有这些工作
class nameVcc: UIViewController { var nameIntVar = 0 var nameStringVar = "Save this" var nameImageVar = UIImage() override func viewDidLoad() { super.viewDidLoad() } required init?(coder NkdPsgVar: NSCoder) { super.init(coder: NkdPsgVar) } override func encodeWithCoder(DkdPsgVar: NSCoder) { } func addTextViewBtnClick() { let viewVar = UIView() // Set many values for view self.view.addSubview(viewVar) } func addImageViewBtnClick() { let imgViewVar = UIImageView() // Set many values for ImageView self.view.addSubview(imgViewVar) } }
我也累了:
convenience init() { self.init() }
和
convenience init() { self.init(coder: NSCoder()) }
TL; DR:
在您的应用中实现状态恢复需要关键步骤和方法。
- 通过为这些方法
shouldSaveApplicationState
和shouldRestoreApplicationState
返回true
来选择App Delegate中的应用程序状态恢复。 - 为要在其中实现状态恢复的视图控制器设置恢复标识符 。
- 在视图控制器中实现
encodeRestorableStateWithCoder
和decodeRestorableStateWithCoder
方法。 前者用于使用encodeObjectForKey
方法将视图控制器的任何状态信息保存到磁盘。 后者将用于通过使用decodeObjectForKey
方法将状态从已保存的内容恢复到磁盘。
观看这篇关于State Restoration的精彩博文,以便更轻松地掌握。 如果你有时间,也要花时间观看国家恢复WWDC会议 。
您无需自己保存整个ViewController
。 当您设置恢复标识符( 在界面生成器中 )时, UIKit
会为您执行此操作。 我们需要关注状态恢复的唯一方法是保存重新创建应用程序“状态”所需的基本属性 ,例如,确定是否要显示特定按钮的Bool
属性。
现在来看你的一系列问题….
我可以保存self.view并自动保存所有子视图吗?
您无需保存任何视图。 所有子视图都将由UIKit
处理。 在encodeRestorableStateWithCoder
方法中编码所需的属性(例如Bool标志, 计数变量,可用于从数据源的api调用获取数据的关键属性等)。 不要忘记从decodeRestorableStateWithCoder
重新decodeRestorableStateWithCoder
视图控制器的状态。 这两种方法都符合UIStateRestoring
协议。
我需要在开始时不使用编码器初始化
不需要做任何花哨的事情。
如何使用NSKeyedUnarchiver将所有这些编码数据保存到文件并检索回来?
正如我之前所说,实现必要的UIStateRestoring
协议方法来保存和恢复应用程序的状态。