Swift 在应用关闭后使用编码器保存 viewcontroller 状态

Swift Save viewcontroller state using coder beyond app close

我正在使用 Xcode 8 和 swift 2.3

我想将整个视图控制器保存到文件并在应用程序关闭后恢复状态。 我到处搜索,发现我们需要为此使用编码器。但都只是显示保存一个对象。 但在这里我需要保存整个 ViewContoller 和子视图。

ViewCotroller 将有三个按钮

问题 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.
  2. 返回 true,在 App Delegate 中选择加入应用程序状态恢复
  3. 为要在其中实现状态恢复的视图控制器设置恢复标识符
  4. 在您的视图控制器中实现 encodeRestorableStateWithCoderdecodeRestorableStateWithCoder 方法。前者用于使用 encodeObjectForKey 方法将视图控制器的任何状态信息保存到磁盘。后者将用于通过使用decodeObjectForKey方法将状态从您保存的内容恢复到磁盘。

观看关于 State Restoration for easier grasp. If you have time, also do spend on watching State Restoration WWDC Session 的精彩博客 post。


不需要自己保存整个ViewControllerUIKit 在您设置恢复标识符( 在 Interface Builder 中)时为您完成。对于状态恢复,我们唯一需要关注的是保存重新创建应用的 "State" 所需的基本 属性 ,因为例如,Bool 属性 确定您是否要显示特定按钮。

现在来回答你的一系列问题....

Can I just save self.view and can it save all subviews automatically ?

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

I need to init without coder at start by just using

不需要做任何花哨的初始化。

How do I save all this coded data to file using NSKeyedUnarchiver and retrieve back?

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