容器视图控制器“不会自动保存对任何包含的子视图控制器的引用。如果您正在实现自定义容器视图控制器,则必须自己编码子视图控制器对象才能保留它们 em>”。
我发现了一些简单的规则:
1.Embedded(child) 视图控制器应该已经在状态保存过程中创建并添加到父视图控制器。因此,如果您使用故事板,则无需执行任何操作,否则您必须实例化子视图控制器并手动添加:
-(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];。
2.您无需自己将子视图控制器保存在父级的-encodeRestorableStateWithCoder: 中,但您应该使用-encodeObject:forKey: 对该对象的引用 进行编码。如果你有参考,你可以这样做:
-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
NSLog(@"Encode");
UIViewController *childViewController = self.childVC;
[coder encodeObject:childViewController forKey:@"ChildVC"];
[super encodeRestorableStateWithCoder:coder];
}
如果您使用 Storyboard,请参阅 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];
}
This 这本书帮助我理解容器视图的状态保存。还有look 为本书提供了一个很好的例子