Swift使用编码器超越app close保存viewcontroller状态

Suj*_*U N 2 uiviewcontroller nscoder ios swift

我正在使用Xcode 8和swift 2.3

我想将整个视图控制器保存到文件并恢复状态,即使应用程序关闭后也是如此.我到处搜索,发现我们需要使用编码器.但所有只是节目保存对象.但在这里我需要保存整个ViewContoller和子视图.

ViewCotroller将有三个按钮

  • 添加文字
  • 添加图片:用户可以添加任意数量的textViews和图像.所以我还需要保存所有信息.
  • 添加ViewController:用户可能拥有此viewController的数组,需要全部保存.

问题1)

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

问题2)

我只需要使用就可以在没有编码器的情况下初始化

let nameVccVar = nameVcc()
Run Code Online (Sandbox Code Playgroud)

let nameVccVar = nameVcc(coder: CodeVar)
Run Code Online (Sandbox Code Playgroud)

问题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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我也累了:

convenience init()
{
    self.init()
}
Run Code Online (Sandbox Code Playgroud)

convenience init()
{
    self.init(coder: NSCoder())
}
Run Code Online (Sandbox Code Playgroud)

bad*_*esh 5

TL; DR:
在您的应用中实现状态恢复需要关键步骤和方法.

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

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


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

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

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

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

我只需要使用就可以在没有编码器的情况下初始化

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

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

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