缓存视图控制器

问题描述 投票:0回答:2

[在iOS中工作时,我发现我的应用程序与iPhone中的Apples默认应用程序有所不同。我的应用程序名称是MyApp,它基于目标C构建,并将其行为与Apple的默认应用程序即Notes进行了比较。

我使用两个应用程序都没有暂停。重新启动设备后,我看到MyAppNotes都显示在最近的列表中,但是当我从最近的列表中打开MyApp时,它从启动屏幕重新启动,这与系统应用程序不同(注释)仍停留在旧屏幕(设备重启之前显示的屏幕)上。有谁知道行为不同的原因是什么?我是否需要执行任何额外的步骤来获得类似Apple默认应用程序的行为?

ios iphone debugging background reboot
2个回答
1
投票

此行为不会自动出现。您必须在应用程序中保存和还原UI状态。苹果有很多有关该主题的文档。我建议从这里开始:https://developer.apple.com/documentation/uikit/view_controllers/preserving_your_app_s_ui_across_launches


1
投票

查看控制器状态还原

iOS的状态还原是在2012年引入的,2013年进行了重大改进。在状态还原方面,iOS可以处理很多事情。在应用程序中启用状态还原后,iOS会处理以下事项:

  • 维护导航控制器,从而维护导航层次结构。
  • 保持选项卡栏控制器的状态,如选定的选项卡等
  • 建立和还原选择进行状态还原的视图控制器。
  • 提供一个加密的存档空间,以对数据进行编码和从中解码数据。
  • 如果控制器是从情节提要构建的,并且在情节提要中选择了还原,则UIKit可以帮助保存控制器并提供控制器引用和还原。

这似乎不容易! iOS几乎完成了所有棘手的任务。

整合

您的代码中的集成可以分为以下几部分:

AppDelegate

在AppDelegate中,我们必须通过实现两个委托方法来为应用程序启用状态还原:

func application(application: UIApplication, shouldSaveApplicationState coder: NSCoder) -> Bool {
  return true
}

func application(application: UIApplication, shouldRestoreApplicationState coder: NSCoder) -> Bool {
  return true
}

ViewControllers

ViewControllers是要保存和还原的。它们是处理应用程序中用户状态的组件。因此,从逻辑上讲,控制器是负责保存和恢复控制器状态的控制器。那么该怎么做?

还原ID:

为了为控制器启用恢复,我们必须为该类提供恢复标识符,如下:

self.restorationId = “Your Restoration Id”

我们可以如下在属性检查器的情节提要中直接设置它enter image description here

注意:如果您不提供任何控制器的还原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.

UIViewControllerRestoration协议

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

//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的情节提要。但是如果我们正在建造您的控制器以编程方式,您必须实现协议独自一人。

保存数据

我们已经熟悉上面的UIStateRestoring协议。为了保存数据,UIKit为我们提供了以下委托方法:

func encodeRestorableState(with coder: NSCoder)

我们通过与密钥对应的编码器对恢复控制器所需的数据进行编码。

注意:Apple建议保存最少的数据,即实际上对于重新创建视图控制器。例如。您要还原用户详细信息页。因此,您需要保存的数据是用户ID,然后数据库查询以获取详细信息并重新创建视图控制器。这是因为Apple用来存储如果操作系统认为必要,可以随时清除数据。所以任何相关的数据将丢失。

还原数据

为了恢复数据,我们必须实现以下委托方法:

func decodeRestorableState(with: NSCoder)

[当UIKit需要还原视图控制器时,将调用此方法。在这里,我们要求编码器获取我们保存的数据,然后我们的常规设置方法应设置UI。编码器具有其他信息,例如版本

对于原创文章,请单击Here

© www.soinside.com 2019 - 2024. All rights reserved.