gpt4 book ai didi

iphone - iOS 状态保存和容器 View

转载 作者:IT王子 更新时间:2023-10-29 08:11:40 26 4
gpt4 key购买 nike

我在使用容器 View 的 Storyboard中有一个 View Controller 。两者都设置了恢复标识符。 parent 正在被保存和恢复得很好。然而 child 不是。 -encodeRestorableStateWithCoder:-decodeRestorableStateWithCoder: 均未在 subview Controller 上调用。

保存使用 View 容器创建的 subview Controller 的正确方法是什么?我可以将 subview Controller 保存在父级 -encodeRestorableStateWithCoder: 中,这将导致它被保存,但我无法在恢复期间使用它。

最佳答案

容器 View Controller “不会自动保存对任何包含的 subview Controller 的引用。如果您正在实现自定义容器 View Controller ,如果您希望保留它们,则必须自己编码 subview Controller 对象”。

我发现了一些简单的规则:

1.Embedded(child) view controller应该已经在状态保存过程中被创建并添加到parent view controller。因此,如果您使用 Storyboard,则无需执行任何操作,否则您将不得不实例化 subview Controller 并手动添加它:

-(void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"Did load");
MyChildViewController *childViewController = [MyChildViewController new];
[self addChildViewController:childViewController];
[childViewController didMoveToParentViewController:self];
self.childVC = childViewController;
}

您可以在 -viewDidLoad 或更高版本添加 subview 。使用 self.childVC.view.frame = [self frameForChildController]; [self.view addSubview:self.childVC.view];为此。

2.您无需将 subview Controller 保存在父级的 -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如果您使用 Storyboard,则可以引用子 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.嵌入式(子) View Controller 应该已经在状态恢复过程中创建并添加到父 View Controller 。所以,如果您在第一段中完成了所有操作,那么这里就没有什么可做的了。

4."然而,在这种情况下,我们不解码 subview Controller 。我们可以,但实际上我们不需要它。MyChildViewController 对象将恢复其自身状态。我们仅对该引用进行编码,以便让运行时将链向下遍历到 MyChildViewController 实例并对其进行保存和恢复。

-(void)decodeRestorableStateWithCoder:(NSCoder *)coder
{
NSLog(@"Decode");
[super decodeRestorableStateWithCoder:coder];
}

This这本书帮助我理解容器 View 的状态保存。还有 look这本书的一个很好的例子

关于iphone - iOS 状态保存和容器 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15799925/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com