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

时间:2014-04-29 17:12:56

标签: ios uistoryboard uistoryboardsegue state-restoration

我是第一次实施iOS状态保存和恢复,所以这个问题对于经验丰富的人来说似乎是显而易见的!

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

在View Controller A中创建一个“大”NSDictionary,然后将其传递给View Controller B,然后通过prepareForSegue方法传递给View Controller C(或直接传递给C)。

我相信我能够在View Controller A中恢复NSDictionary,但是如何为View Controller B和/或C获取它而不是制作额外的副本?

2 个答案:

答案 0 :(得分:1)

这里应该没有关于记忆的担忧。让我们说它看起来像这样:

- (void) prepareForSegue .... {
  nextViewController.dictionary = self.dictionary;    
}

我避免了细节,但重点是这是传递对NSDictionary的引用,而不是复制整个字典。这意味着所有视图控制器实际上将共享完全相同的字典。

所以他们应该对拥有一本大字典的副本感到担忧。虽然您应该知道,如果View Controller B没有更改字典,那么这些更改将在每个其他视图控制器中受到影响。

希望这个答案。

答案 1 :(得分:0)

因为从根开始按顺序恢复视图控制器,所以我发现它实际上很简单。首先,获取导航控制器中当前视图控制器的索引。从那里,找出以前哪个视图控制器。 (如果我的故事板更复杂,我可以在前一个视图控制器上使用" 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];
    }
}