视图控制器之间共享数据时的iOS状态保留和恢复

视图控制器之间共享数据时的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获取它,而不是制作其他副本?这里应该

我是第一次实现iOS状态保存和恢复,所以这个问题对于更有经验的人来说可能是显而易见的

我有一个故事板,有多条通往不同场景的路径。例如,从场景A开始,用户可以进入场景B,然后进入场景C,或者用户可以直接进入场景C

在视图控制器A中创建一个“大型”NSDictionary,然后将其传递给视图控制器B,然后通过prepareForSegue方法传递给视图控制器C(或直接传递给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(刚刚还原)。这有意义吗?