视图控制器之间共享数据时的iOS状态保留和恢复
我是第一次实现iOS状态保存和恢复,所以这个问题对于更有经验的人来说可能是显而易见的 我有一个故事板,有多条通往不同场景的路径。例如,从场景A开始,用户可以进入场景B,然后进入场景C,或者用户可以直接进入场景C 在视图控制器A中创建一个“大型”NSDictionary,然后将其传递给视图控制器B,然后通过prepareForSegue方法传递给视图控制器C(或直接传递给C)视图控制器之间共享数据时的iOS状态保留和恢复,ios,uistoryboard,uistoryboardsegue,state-restoration,Ios,Uistoryboard,Uistoryboardsegue,State Restoration,我是第一次实现iOS状态保存和恢复,所以这个问题对于更有经验的人来说可能是显而易见的 我有一个故事板,有多条通往不同场景的路径。例如,从场景A开始,用户可以进入场景B,然后进入场景C,或者用户可以直接进入场景C 在视图控制器A中创建一个“大型”NSDictionary,然后将其传递给视图控制器B,然后通过prepareForSegue方法传递给视图控制器C(或直接传递给C) 我相信我能够在视图控制器A中恢复NSDictionary,但如何为视图控制器B和/或C获取它,而不是制作其他副本?这里应该
我相信我能够在视图控制器A中恢复NSDictionary,但如何为视图控制器B和/或C获取它,而不是制作其他副本?这里应该不考虑内存问题。假设它看起来像这样:
- (void) prepareForSegue .... {
nextViewController.dictionary = self.dictionary;
}
我避免了细节,但主要的一点是,这是传递对NSDictionary的引用,而不是复制整个dictionary。这意味着您的所有视图控制器实际上将共享完全相同的字典
所以他们不应该担心有一本大字典的副本。尽管您应该知道,如果视图控制器B不更改字典,那么这些更改将在其他每个视图控制器中受到影响
希望答案是这样。因为视图控制器是按顺序恢复的,从根开始,我发现按照我的要求执行实际上非常简单。首先,获取导航控制器中当前视图控制器的索引。从中,找出哪个视图控制器出现在前面。(如果我的故事板更复杂,我可以在前面的视图控制器上使用“isKindOfClass”来确定如何在其中获取NSDictionary。) 例如:
- (void)decodeRestorableStateWithCoder:(NSCoder *)coder
{
[super decodeRestorableStateWithCoder:coder];
// get current index of views in navigation controller
int index = [[self navigationController].viewControllers indexOfObject:self];
if (index == 1) {
ViewControllerA *view = [[self navigationController].viewControllers objectAtIndex:index - 1];
self.dict = view.someDict;
}
else if (index == 2) {
ViewControllerB *view = [[self navigationController].viewControllers objectAtIndex:index - 1];
self.dict = view.arrayOfDict[0];
}
}
字典中有多少个键/值?请查看
nsserdefaults
或单例模式,然后查看NSCoding
协议。随着应用程序的逻辑从在字典中管理其状态发展而来,您可能希望在自定义对象或单例类中保持状态。如果是前者,您可以将该对象写入磁盘,或写入NSUserDefaults
,以便根据需要提取该对象。如果您使用单例方法,您将在内存中拥有该实例,以便在需要时随时使用。不管怎么说,随着状态复杂性的增加,有很多方法来管理它。NSDictionary非常庞大和复杂。虽然我可以创建多个副本,但我想知道如何避免它。是的,这正是正在发生的事情。因此,在nextViewController的decodeRestorableStateWithCoder:method中,是否可以从以前的视图控制器获取(已还原的)NSDictionary?但decodeRestorableState应该仅在还原内存已释放的应用程序时发生。不我理解,您不应该每次执行到不同ViewControlleries的序列时都进行编码/解码。但是,如果我的应用程序需要还原(例如,系统终止),我将尝试还原使用encodeRestorableStateWithCoder:保存的视图控制器的数据。由于iOS使用还原ID(按顺序)为我故事板中的每个视图控制器调用此委托方法,我希望视图控制器B引用视图控制器a中的NSDictionary(刚刚还原)。这有意义吗?