[英]Cache View Controller
在iOS
工作时,我发现我的应用程序与 iPhone 中 Apple 的默认应用程序之间存在差异。 我的应用程序名称是MyApp
,它是基于目标 C 构建的,我将其行为与 Apple 的默认应用程序(即Notes
。
我在没有暂停的情况下使用了这两个应用程序。 当设备重新启动时,我看到MyApp
和Notes
都显示在最近的列表中,但是当我从最近的列表中打开MyApp
,它会从初始屏幕重新启动,这与系统应用程序(Notes)不同,它仍然停留在旧屏幕(屏幕它在设备重启之前显示)。 任何人都知道不同行为的原因是什么? 我是否需要执行任何额外的步骤来获得与 Apple 默认应用程序类似的行为?
这种行为不会自动出现。 您必须在应用中保存和恢复 UI 状态。 Apple 有很多关于这个主题的文档; 我建议从这里开始: https : //developer.apple.com/documentation/uikit/view_controllers/preserving_your_app_s_ui_across_launches
iOS 中的状态恢复是在 2012 年引入的,2013 年发生了重大改进。 iOS 在状态恢复方面处理了很多事情。 在应用程序中启用状态恢复后,iOS 会处理以下事项:
看起来是不是很简单!! iOS 做几乎所有棘手的事情。
代码中的集成可以分解为以下部分:
在 AppDelegate 中,我们必须通过实现两个委托方法来为我们的应用程序启用状态恢复:
func application(application: UIApplication, shouldSaveApplicationState coder: NSCoder) -> Bool {
return true
}
func application(application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool {
return true
}
ViewControllers 是要保存和恢复的。 它们是处理应用程序中用户状态的组件。 所以逻辑上,控制器负责保存和恢复控制器的状态。 那么怎么做呢?
为了为控制器启用恢复,我们必须为类提供一个恢复标识符,如下所示:
self.restorationId = “Your Restoration Id”
注意:如果您没有为任何控制器提供恢复 ID,它将被排除在恢复过程之外,包括该控制器之后导航层次结构中的所有控制器。
恢复类是知道如何创建特定视图控制器的类。 这个类应该符合 UIViewControllerRestoration 协议。 UIStateRestoring 协议 每个类默认确认为UIStateRestoring协议。 该协议具有委托方法和属性来帮助控制器保存相关信息以构建 UI。
//Encoding and Decoding the Object
func encodeRestorableState(with: NSCoder)
//Encodes state-related information for the object.
func decodeRestorableState(with: NSCoder)
//Decodes and restores state-related information for the object.
func applicationFinishedRestoringState()
//Called after all objects have had a chance to decode their state.
对象采用的方法,以便它们可以在状态恢复期间充当视图控制器的“恢复类”。 任何采用此协议的类都在恢复时提供控制器的参考。 视图控制器应该分配这个类作为它的恢复类。
//Creating the View Controller
static func viewController(withRestorationIdentifierPath: [String], coder: NSCoder) -> UIViewController?
//Asks the receiver to provide the view controller that corresponds to the specified identifier information.
Required.
注意:如果我们从情节提要构建控制器,通常不需要遵守
UIViewControllerRestoration
协议,因为视图控制器的参考是在恢复时由UIKit
从情节UIKit
中获取的。 但是,如果我们以编程方式构建您的控制器,则您必须自己实现协议。
上面我们已经熟悉了 UIStateRestoring 协议。 为了保存数据,UIKit 为我们提供了以下委托方法:
func encodeRestorableState(with coder: NSCoder)
我们通过与密钥对应的编码器对恢复控制器所需的数据进行编码。
注意:Apple 建议保存最少的数据,即重新创建视图控制器实际需要的数据。 例如。 您想要恢复“用户详细信息”页面。 因此,您需要保存的数据是用户 ID,然后进行数据库查询以获取详细信息并重新创建视图控制器。 这是因为如果操作系统认为有必要,可以随时清除 Apple 用于存储数据的加密存档。 因此,任何相关数据都将丢失。
为了恢复数据,我们必须实现以下委托方法:
func decodeRestorableState(with: NSCoder)
当 UIKit 需要恢复视图控制器时调用此方法。 在这里,我们要求编码器获取我们保存的数据,然后我们的正常设置方法应该设置 UI。 编码器具有附加信息,例如版本
原创文章请点击这里
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.