我正在尝试在使用iOS 6+和故事板的应用程序中实现状态恢复,但是我在找到防止重量级方法重复调用的方法时遇到了问题.
如果我只是启动应用程序,那么我需要在以下位置设置用户界面viewDidLoad:
- (void)viewDidLoad {
[super viewDidLoad];
[self setupUI];
}
Run Code Online (Sandbox Code Playgroud)
这在正常的非状态恢复世界中工作正常.现在我添加了状态恢复,在恢复了一些属性后,我需要用这些属性更新UI:
- (void)decodeRestorableStateWithCoder:(NSCoder *)coder {
[super decodeRestorableStateWithCoder:coder];
// restore properties and stuff
// [...]
[self setupUI];
}
Run Code Online (Sandbox Code Playgroud)
那么现在发生的事情是首先setupUI调用方法viewDidLoad,然后再调用方法decodeRestorableStateWithCoder:.我没有看到一个我可以覆盖的方法,它始终被称为last.
这是方法调用的正常顺序:
使用状态恢复时,这称为:
我无法将调用setupUI放入,viewWillAppear因为每次本机返回视图时它也会被执行.
如果decodeRestorableStateWithCoder被称为BEFORE 会更加方便,viewDidLoad因为那时你可以使用恢复的属性.可悲的是,不是这样,所以...... viewDidLoad当我知道我需要在decodeRestorableStateWithCoder之后重新做一遍时,我怎么能阻止这项工作呢?
我的应用程序有一个简单的组织,我在Interface Builder故事板中配置(不在代码中).有一个导航视图控制器,其根视图控制器设置为我的主视图控制器.我的主视图包含一个表格,其中单元格转到细节视图控制器.
当我在查看详细信息视图时暂停应用程序然后恢复它时,我将返回主视图,而不是详细信息视图.为什么会这样?
细节:
我在Interface Builder中为导航视图控制器,主视图控制器和详细视图控制器设置了恢复ID.我还尝试在表视图中添加Restoration ID,并使主视图控制器实现UIDataSourceModelAssociation.
我的应用程序从shouldRestoreApplicationState返回YES,主视图和详细信息视图都有encode/decodeRestorableStateWithCoder方法.
我正在使用模拟器测试暂停/恢复:我运行应用程序,导航到详细信息视图,点击主页按钮,然后单击XCode中的停止按钮.要恢复,我正在从XCode再次运行该应用程序.
我在挂起时看到以下调用:
AppDelegate shouldSaveApplicationState
MainViewController encodeRestorableStateWithCoder
DetailViewController encodeRestorableStateWithCoder
Run Code Online (Sandbox Code Playgroud)
在简历上:
AppDelegate shouldRestoreApplicationState
AppDelegate viewControllerWithRestorationIdentifierPath Navigation
AppDelegate viewControllerWithRestorationIdentifierPath Navigation/MainView
MainViewController viewDidLoad
AppDelegate viewControllerWithRestorationIdentifierPath Navigation/DetailView
MainViewController decodeRestorableStateWithCoder
Run Code Online (Sandbox Code Playgroud)
除了正在恢复的错误视图之外,还有其他奇怪之处:为什么详细信息视图的"恢复标识符路径"为"Navigation/DetailView"而不是"Navigation/MainView/DetailView"?导航视图控制器和详细视图控制器之间没有直接关系.它们在Interface Builder中的唯一连接是通过主视图中的segue.
我错误配置了什么吗?
我已经尝试将Restoration Class分配给Detail View.当调用该恢复代码时,它会失败,因为未在编码器中设置UIStateRestorationViewControllerStoryboardKey.
这是我的项目的玩具版本,它复制了这个问题:https://github.com/WanderingStar/RestorationTest
我正在尝试使用XCode版本5.0(5A1413)和iOS模拟器版本7.0(463.9.4),以防这些相关.