繁体   English   中英

缓存视图控制器

[英]Cache View Controller

iOS工作时,我发现我的应用程序与 iPhone 中 Apple 的默认应用程序之间存在差异。 我的应用程序名称是MyApp ,它是基于目标 C 构建的,我将其行为与 Apple 的默认应用程序(即Notes

我在没有暂停的情况下使用了这两个应用程序。 当设备重新启动时,我看到MyAppNotes都显示在最近的列表中,但是当我从最近的列表中打开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 会处理以下事项:

  • 维护导航控制器,从而维护导航层次结构。
  • 维护标签栏控制器的状态,如选定的标签等。
  • 建立和恢复选择状态恢复的视图控制器。
  • 提供一个加密的存档空间来编码数据和解码数据。
  • 如果控制器是从故事板构建的,并且在故事板本身中选择了恢复,则 UIKit 有助于保存控制器并提供控制器引用和恢复。

看起来是不是很简单!! 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.

UIViewController 恢复协议

对象采用的方法,以便它们可以在状态恢复期间充当视图控制器的“恢复类”。 任何采用此协议的类都在恢复时提供控制器的参考。 视图控制器应该分配这个类作为它的恢复类。

//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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM