iOS的状态保存和集装箱意见(iOS state preservation and containe

2019-08-19 08:14发布

我在正在使用的容器视图故事板的视图控制器。 两人都恢复标识符集。 父被保存和恢复就好了。 然而,孩子是不是。 无论-encodeRestorableStateWithCoder:-decodeRestorableStateWithCoder:被称为子视图控制器上。

什么是保存与视图容器中创建子视图控制器的正确方法是什么? 我能救子视图控制器父母-encodeRestorableStateWithCoder:这将导致它被保存,但是我没有在还原过程中使用它的方式。

Answer 1:

容器视图控制器“ 不会自动保存到任何封闭式儿童视图控制器的引用。如果要实现自定义的容器视图控制器,你必须编码子视图控制器对象自己,如果你希望他们被保留 ”。

还有,我发现简单的规则:

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];
}

这本书帮助我理解状态保存与容器的观点。 也期待一个很好的例子,这本书



Answer 2:

我想答案是在文档有人说:

“UIViewController类保存到呈现视图控制器和故事板(如果有的话)用于创建视图控制器的引用。视图控制器还询问意见,其视图层次要保存任何相关信息。 但是,此类不会自动保存到任何包含的子视图控制器的引用。如果要实现自定义的容器视图控制器,你必须编码子视图控制器,如果你希望他们保留对象自己。“

所以,你可以做这样的事情:

-(void)encodeRestorableStateWithCoder:(NSCoder *)coder {
    [super encodeRestorableStateWithCoder:coder];
    [self.myChildViewController encodeRestorableStateWithCoder:coder];
}

-(void)decodeRestorableStateWithCoder:(NSCoder *)coder {
    [super decodeRestorableStateWithCoder:coder];
    [self.myChildViewController decodeRestorableStateWithCoder:coder];
}

而在MyChildViewController不叫超:)



文章来源: iOS state preservation and container views