gpt4 book ai didi

ios - UIViewController 生命周期调用结合状态恢复

转载 作者:技术小花猫 更新时间:2023-10-29 11:01:07 26 4
gpt4 key购买 nike

我正在尝试在使用 iOS 6+ 和 Storyboard 的应用程序中实现状态恢复,但我在寻找防止重复调用繁重方法的方法时遇到了问题。

如果我只是启动应用程序,那么我需要在 viewDidLoad 中设置 UI:

- (void)viewDidLoad {
[super viewDidLoad];
[self setupUI];
}

这在正常的、非状态恢复的世界中工作正常。现在我添加了状态恢复,在恢复一些属性后我需要用这些属性更新 UI:

- (void)decodeRestorableStateWithCoder:(NSCoder *)coder {
[super decodeRestorableStateWithCoder:coder];
// restore properties and stuff
// [...]
[self setupUI];
}

现在发生的事情是,首先从 viewDidLoad 调用 setupUI 方法,然后再次从 decodeRestorableStateWithCoder: 调用。我没有看到我可以重写的方法,它总是最后调用。

这是方法调用的正常顺序:

  • 从 Nib 醒来
  • viewDidLoad
  • viewWillAppear
  • viewDidAppear

当使用状态恢复时,这被称为:

  • 从 Nib 醒来
  • viewDidLoad
  • 解码RestorableStateWithCoder
  • viewWillAppear
  • viewDidAppear

我无法在 viewWillAppear 中放置对 setupUI 的调用,因为那样它也会在您每次返回 View 时执行。

如果在 viewDidLoad 之前调用 decodeRestorableStateWithCoder 会更方便,因为这样您就可以使用恢复的属性。遗憾的是,情况并非如此,所以...当我知道我需要立即在 decodeRestorableStateWithCoder 中重新完成工作时,如何才能阻止在 viewDidLoad 中完成工作?

最佳答案

如果您以编程方式进行状态恢复(即不使用 Storyboard ),您可以使用 + viewControllerWithRestorationIdentifierPath:coder:,在那里初始化 View Controller 并使用编码器所需的任何内容来执行您的操作pre-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 中。因此,虽然这可行(如果您不使用 Storyboard),但另一种选择是重构您设置 View Controller 的方式。不使用标志,而是将代码片段移动到它们自己的方法中,并从两个地方调用这些方法。

关于ios - UIViewController 生命周期调用结合状态恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18107376/

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