我在正在使用的容器视图故事板的视图控制器。 两人都恢复标识符集。 父被保存和恢复就好了。 然而,孩子是不是。 无论-encodeRestorableStateWithCoder:
或-decodeRestorableStateWithCoder:
被称为子视图控制器上。
什么是保存与视图容器中创建子视图控制器的正确方法是什么? 我能救子视图控制器父母-encodeRestorableStateWithCoder:
这将导致它被保存,但是我没有在还原过程中使用它的方式。
我在正在使用的容器视图故事板的视图控制器。 两人都恢复标识符集。 父被保存和恢复就好了。 然而,孩子是不是。 无论-encodeRestorableStateWithCoder:
或-decodeRestorableStateWithCoder:
被称为子视图控制器上。
什么是保存与视图容器中创建子视图控制器的正确方法是什么? 我能救子视图控制器父母-encodeRestorableStateWithCoder:
这将导致它被保存,但是我没有在还原过程中使用它的方式。
容器视图控制器“ 不会自动保存到任何封闭式儿童视图控制器的引用。如果要实现自定义的容器视图控制器,你必须编码子视图控制器对象自己,如果你希望他们被保留 ”。
还有,我发现简单的规则:
1.Embedded(子)视图控制器应该已经被创建并添加到父视图控制器在状态保存过程。 所以,不要做任何事情,如果你使用的故事板,否则你就必须实例子视图控制器和手动添加:
-(void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"Did load");
MyChildViewController *childViewController = [MyChildViewController new];
[self addChildViewController:childViewController];
[childViewController didMoveToParentViewController:self];
self.childVC = childViewController;
}
您可以在添加子视图-viewDidLoad
或更高版本。 使用self.childVC.view.frame = [self frameForChildController]; [self.view addSubview:self.childVC.view];
self.childVC.view.frame = [self frameForChildController]; [self.view addSubview:self.childVC.view];
为了这。
2.You没有必要保存在父母的子视图控制器-encodeRestorableStateWithCoder:
自己,但你应该使用编码该对象的引用 -encodeObject:forKey:
如果你参考,你可以做这样的:
-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
NSLog(@"Encode");
UIViewController *childViewController = self.childVC;
[coder encodeObject:childViewController forKey:@"ChildVC"];
[super encodeRestorableStateWithCoder:coder];
}
看https://stackoverflow.com/a/13279703/2492707如果你用故事板获得参考孩子的VC。 或者你可以写这样简单的东西:
-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
NSLog(@"Encode");
UIViewController *childViewController = [self.childViewControllers objectAtIndex:0]; //[self.childViewControllers lastObject];
[coder encodeObject:childViewController forKey:@"ChildVC"];
[super encodeRestorableStateWithCoder:coder];
}
3. 嵌入式(子)视图控制器应该已经被创建,并在状态恢复过程中添加到父视图控制器 。 所以,如果你在第一段做的一切,没有什么更多的在这里做的。
4.“在这种情况下,然而,我们不解码子视图控制器,我们可以 ,但实际上我们并不需要后援MyChildViewController对象将恢复自己的状态。我们只是为了获得运行时编码这个参考走环比下滑至MyChildViewController实例,并做保存和恢复就可以了”。
-(void)decodeRestorableStateWithCoder:(NSCoder *)coder
{
NSLog(@"Decode");
[super decodeRestorableStateWithCoder:coder];
}
这本书帮助我理解状态保存与容器的观点。 也期待一个很好的例子,这本书
我想答案是在文档有人说:
“UIViewController类保存到呈现视图控制器和故事板(如果有的话)用于创建视图控制器的引用。视图控制器还询问意见,其视图层次要保存任何相关信息。 但是,此类不会自动保存到任何包含的子视图控制器的引用。如果要实现自定义的容器视图控制器,你必须编码子视图控制器,如果你希望他们保留对象自己。“
所以,你可以做这样的事情:
-(void)encodeRestorableStateWithCoder:(NSCoder *)coder {
[super encodeRestorableStateWithCoder:coder];
[self.myChildViewController encodeRestorableStateWithCoder:coder];
}
-(void)decodeRestorableStateWithCoder:(NSCoder *)coder {
[super decodeRestorableStateWithCoder:coder];
[self.myChildViewController decodeRestorableStateWithCoder:coder];
}
而在MyChildViewController不叫超:)