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:
在您的应用中实现状态恢复需要关键步骤和方法。

  1. 通过为这些方法shouldSaveApplicationStateshouldRestoreApplicationState返回true来选择App Delegate中的应用程序状态恢复。
  2. 为要在其中实现状态恢复的视图控制器设置恢复标识符
  3. 在视图控制器中实现encodeRestorableStateWithCoderdecodeRestorableStateWithCoder方法。 前者用于使用encodeObjectForKey方法将视图控制器的任何状态信息保存到磁盘。 后者将用于通过使用decodeObjectForKey方法将状态从已保存的内容恢复到磁盘。

观看这篇关于State Restoration的精彩博文,以便更轻松地掌握。 如果你有时间,也要花时间观看国家恢复WWDC会议 。


无需自己保存整个ViewController 。 当您设置恢复标识符( 在界面生成器中 )时, UIKit会为您执行此操作。 我们需要关注状态恢复的唯一方法是保存重新创建应用程序“状态”所需的基本属性 ,例如,确定是否要显示特定按钮的Bool属性。

现在来看你的一系列问题….

我可以保存self.view并自动保存所有子视图吗?

您无需保存任何视图。 所有子视图都将由UIKit处理。 在encodeRestorableStateWithCoder方法中编码所需的属性(例如Bool标志, 计数变量,可用于从数据源的api调用获取数据的关键属性等)。 不要忘记从decodeRestorableStateWithCoder重新decodeRestorableStateWithCoder视图控制器的状态。 这两种方法都符合UIStateRestoring协议。

我需要在开始时不使用编码器初始化

不需要做任何花哨的事情。

如何使用NSKeyedUnarchiver将所有这些编码数据保存到文件并检索回来?

正如我之前所说,实现必要的UIStateRestoring协议方法来保存和恢复应用程序的状态。