我正在尝试在使用 iOS 6+ 和故事板的应用程序中实现状态恢复,但我在寻找防止重复调用繁重方法的方法时遇到问题。
如果我只是启动应用程序,那么我需要在中设置用户界面viewDidLoad
:
- (void)viewDidLoad {
[super viewDidLoad];
[self setupUI];
}
这在正常的、非国家恢复的世界中运作良好。现在我添加了状态恢复,恢复一些属性后,我需要使用这些属性更新 UI:
- (void)decodeRestorableStateWithCoder:(NSCoder *)coder {
[super decodeRestorableStateWithCoder:coder];
// restore properties and stuff
// [...]
[self setupUI];
}
所以现在发生的事情是首先setupUI
方法被调用自viewDidLoad
,然后再次从decodeRestorableStateWithCoder:
。我没有看到可以重写且始终最后调用的方法。
这是方法调用的正常顺序:
- 从笔尖唤醒
- viewDidLoad
- 视图将出现
- 查看是否出现
当使用状态恢复时,这被称为:
- 从笔尖唤醒
- viewDidLoad
- 解码RestorableStateWithCoder
- 视图将出现
- 查看是否出现
我无法拨打电话setupUI
in viewWillAppear
因为这样每次你原生回到视图时它也会被执行。
如果decodeRestorableStateWithCoder
之前被称为viewDidLoad
因为这样你就可以使用恢复的属性。可悲的是事实并非如此,所以...我怎样才能阻止在viewDidLoad
当我知道我需要重新做一遍decodeRestorableStateWithCoder
就在之后?
如果您以编程方式进行状态恢复(即不使用故事板),您可以使用+ viewControllerWithRestorationIdentifierPath:coder:
,在那里初始化视图控制器并使用编码器所需的任何内容来进行预 viewDidLoad 初始化。
+ (UIViewController *)viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder
{
if ([[identifierComponents lastObject] isEqualToString:kViewControllerRestorationIdentifier]) {
if ([coder containsValueForKey:kIDToRestore]) {
// Can only restore if we have an ID, otherwise return nil.
int savedId = [coder decodeIntegerForKey:kIDToRestore];
ViewController *vc = [[ViewController alloc] init];
[vc setThingId:savedId];
return vc;
}
}
return nil;
}
我发现尝试实现状态恢复在我的代码中显示出不良的编程实践,例如将太多内容打包到viewDidLoad
。因此,虽然这可行(如果您不使用故事板),但另一个选择是重构您设置视图控制器的方式。不要使用标志,而是将代码片段移动到它们自己的方法中,并从两个地方调用这些方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)