本文使用chatGPT(gpt-3.5-turbo)翻译,加以部分人工润色排版,如有问题请在评论区指出
原文地址:链接
About the UI preservation process(关于UI保留过程)
了解如何自定义UIKit的状态保留过程
概览
下面的图表展示了界面保留过程中发生的调用顺序。在询问应用程序委托是否要保留应用程序状态后,UIKit会对当前应用程序的视图控制器层次结构中的对象进行编码。只有具有有效 restorationIdentifier
的视图控制器才会被保留。
保留过程会遍历您的视图控制器层次结构,并递归地对找到的对象进行编码。该过程从应用程序窗口的根视图控制器开始,将他们的数据写入提供的存档中。如果根视图控制器的数据包含对其他视图控制器的引用,UIKit会要求每个新视图控制器在存档的不同部分中编码其数据。这些子视图控制器可能会进一步编码其自己的子视图控制器,以此类推。
UIKit视图控制器会自动对其子视图控制器进行适当的编码。如果您定义了一个自定义容器视图控制器,您的视图控制器的 encodeRestorableState(with:) 方法必须类似地将任何子视图控制器写入提供的存档中。
排除不需要保留的视图控制器
有两种方法可以排除视图控制器(及其视图)不参与状态恢复过程:
将其
restorationIdentifier
属性设置为nil
。提供一个恢复类,并在
viewController(withRestorationIdentifierPath:coder:)
方法返回nil
。
排除视图控制器将阻止该视图控制器被保存在存档(archive)中。它还会排除该视图控制器的子视图控制器不进行保留。
在您的应用程序中对任何对象进行编码
状态恢复不仅限于您的应用程序的视图和视图控制器。任何采用 UIStateRestoring
协议的对象也可以包含在恢复存档中。例如,您可以在存储应用程序的全局配置数据的对象中采用此协议。要将这样的对象添加到存档中,请按照以下步骤进行操作:
在应用程序运行时,通过调用
UIApplication
的registerObject(forStateRestoration:restorationIdentifier:)
方法来注册对象。例如,您可以在创建配置对象后立即注册它。在您的
encodeRestorableState(with:)
方法之一中,将对象编码到恢复存档中。您还可以在应用程序委托的application(_:willEncodeRestorableStateWith:)
方法中对其进行编码。
您可以对自定义对象编码任何您想要的数据,只要这些数据足以在下一次启动周期中将该对象恢复到先前的状态。编码那些对您的应用程序行为并不关键的数据,绝不要编码应以其他方式持久化的数据。例如,不要对应用程序的设置和用户数据进行编码。