我是第一次实施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获取它而不是制作额外的副本?
答案 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];
}
}