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

时间:2017-09-24 20:08:40

标签: ios swift uiviewcontroller nscoder

我正在使用Xcode 8和swift 2.3

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

ViewCotroller将有三个按钮

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

问题1)

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

问题2)

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

name = input('Enter name: ')

# if you want to take spaces into account, i.e. inputs like 
# 'Spam Eggs', change the following line to: 
# while any(x for x in name.split() if not x.isalpha()):

while not name.isalpha():
    print('Invalid input!')
    name = input('Enter name: ')

with open(filename, 'a') as f:
    f.write(name + '\n')

let nameVccVar = nameVcc()

问题3)

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

请帮助我或给我提示让所有这些工作

let nameVccVar = nameVcc(coder: CodeVar)

我也累了:

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()
}

1 个答案:

答案 0 :(得分:5)

<强> TL; DR:
在您的应用中实施状态恢复需要一些关键步骤和方法。

  1. 通过返回true这些方法shouldSaveApplicationStateshouldRestoreApplicationState来选择应用代表中的应用状态恢复。
  2. 为要在其中实施状态恢复的视图控制器设置恢复标识符
  3. 在视图控制器中实现encodeRestorableStateWithCoderdecodeRestorableStateWithCoder方法。前者用于使用encodeObjectForKey方法将视图控制器的任何状态信息保存到磁盘。后者将用于使用decodeObjectForKey方法将状态从已保存的内容恢复到磁盘。
  4. 观看这篇关于State Restoration的精彩博文,以便更轻松地掌握。如果你有时间,也要花钱观看State Restoration WWDC Session

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

    现在提出一系列问题......

      

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

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

      

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

    无需做任何花哨的事情。

      

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

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