[在iOS
中工作时,我发现我的应用程序与iPhone中的Apples默认应用程序有所不同。我的应用程序名称是MyApp
,它基于目标C构建,并将其行为与Apple的默认应用程序即Notes
进行了比较。
我使用两个应用程序都没有暂停。重新启动设备后,我看到MyApp
和Notes
都显示在最近的列表中,但是当我从最近的列表中打开MyApp
时,它从启动屏幕重新启动,这与系统应用程序不同(注释)仍停留在旧屏幕(设备重启之前显示的屏幕)上。有谁知道行为不同的原因是什么?我是否需要执行任何额外的步骤来获得类似Apple默认应用程序的行为?
此行为不会自动出现。您必须在应用程序中保存和还原UI状态。苹果有很多有关该主题的文档。我建议从这里开始: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
的情节提要。但是如果我们正在建造您的控制器以编程方式,您必须实现协议独自一人。
我们已经熟悉上面的UIStateRestoring协议。为了保存数据,UIKit为我们提供了以下委托方法:
func encodeRestorableState(with coder: NSCoder)
我们通过与密钥对应的编码器对恢复控制器所需的数据进行编码。
注意:Apple建议保存最少的数据,即实际上对于重新创建视图控制器。例如。您要还原用户详细信息页。因此,您需要保存的数据是用户ID,然后数据库查询以获取详细信息并重新创建视图控制器。这是因为Apple用来存储如果操作系统认为必要,可以随时清除数据。所以任何相关的数据将丢失。
为了恢复数据,我们必须实现以下委托方法:
func decodeRestorableState(with: NSCoder)
[当UIKit需要还原视图控制器时,将调用此方法。在这里,我们要求编码器获取我们保存的数据,然后我们的常规设置方法应设置UI。编码器具有其他信息,例如版本
对于原创文章,请单击Here