Swift 在应用关闭后使用编码器保存 viewcontroller 状态
Swift Save viewcontroller state using coder beyond app close
我正在使用 Xcode 8 和 swift 2.3
我想将整个视图控制器保存到文件并在应用程序关闭后恢复状态。
我到处搜索,发现我们需要为此使用编码器。但都只是显示保存一个对象。
但在这里我需要保存整个 ViewContoller 和子视图。
ViewCotroller 将有三个按钮
- 添加文字
- 添加图像:用户可以添加任意数量的文本视图和图像。所以我还需要保存所有这些信息。
- Add 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 for easier grasp. If you have time, also do spend on watching State Restoration WWDC Session 的精彩博客 post。
不需要自己保存整个ViewController
。 UIKit
在您设置恢复标识符( 在 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
协议方法来保存和恢复应用的状态。
我正在使用 Xcode 8 和 swift 2.3
我想将整个视图控制器保存到文件并在应用程序关闭后恢复状态。 我到处搜索,发现我们需要为此使用编码器。但都只是显示保存一个对象。 但在这里我需要保存整个 ViewContoller 和子视图。
ViewCotroller 将有三个按钮
- 添加文字
- 添加图像:用户可以添加任意数量的文本视图和图像。所以我还需要保存所有这些信息。
- Add 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
. 返回 - 为要在其中实现状态恢复的视图控制器设置恢复标识符。
- 在您的视图控制器中实现
encodeRestorableStateWithCoder
和decodeRestorableStateWithCoder
方法。前者用于使用encodeObjectForKey
方法将视图控制器的任何状态信息保存到磁盘。后者将用于通过使用decodeObjectForKey
方法将状态从您保存的内容恢复到磁盘。
true
,在 App Delegate 中选择加入应用程序状态恢复
观看关于 State Restoration for easier grasp. If you have time, also do spend on watching State Restoration WWDC Session 的精彩博客 post。
不需要自己保存整个ViewController
。 UIKit
在您设置恢复标识符( 在 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
协议方法来保存和恢复应用的状态。