2014-10-20 89 views
6

我只是想在我的一个应用程序中实现iOS状态恢复API。 最后得到它的工作后,我发现我模式呈现的ViewController使用动画恢复,这不是我想要的。我希望我的应用只处于我离开它的状态,但不会让用户看到他到达那里的热度。iOS状态恢复动画错误

所以我继续下载苹果示例代码:https://developer.apple.com/library/ios/samplecode/StateRestore/Introduction/Intro.html,并希望看看它是否也发生在那里。事实证明它确实如此。

另外,也有在记录一个警告:

Unbalanced calls to begin/end appearance transitions for <UINavigationController: 0x7b0512b0>. 

你能告诉我,如果我和明明苹果示例代码做错了什么,或者如果它是iOS中的错误吗?

Btw。我在iOS8上

测试感谢您的帮助, 乔治

回答

20

直接从苹果以下解决方案来。

在您的应用程序委托中,您应该实施application:willFinishLaunchingWithOptions:(取代或补充didFinishLaunching)。

self.window?.makeKeyAndVisible() 

或者,如果这是Objective-C的:

[self.window makeKeyAndVisible]; 
在您的实现,可能是因为最后一行返回 true(或者是如果这是Objective-C的),插入此行之前

事实证明,这是始终需要,但文档从未明确。

+0

你引用的苹果相同的代码实际上现在做这个,所以我不知道你为什么看到那里的问题。 – matt 2014-10-27 16:10:43

+1

耶。给问题添加赏金的作品! Apple代码在'didFinishLaunchingWithOptions'内部调用'makeKeyAndVisible'而不是'willFinishLaunchingWithOptions'。将它移动到'willFinishLaunchingWithOptions'可以使所有事情都正常工作。谢谢!我会在23小时内奖励赏金(Stack Overflow现在不允许我这么做)。 – bogdansrc 2014-10-27 16:23:14

+0

@bogdansrc你的眼睛比我的眼睛更清晰!你是完全正确的:苹果示例代码在错误的地方做了正确的事情,这就是为什么它没有解决问题。有趣的是,他们在该行之前插入的评论清楚地表明,他们认为他们把它放在正确的位置:“要求在恢复状态之前窗口可见”。正是如此;但“国家恢复之前”意味着'willFinish'结束之前!这就是代码的全部重点!这是值得提交关于该错误报告(如果你喜欢它)。 – matt 2014-10-27 17:03:16

-1

苹果示例代码似乎很好地工作在Xcode的8

,所以我想没有额外的代码更改将需要

1

从技术文档: Preserving Your App’s Visual Appearance Across Launches

从下面的清单见第3项。

检查表执行国家保护修缮

支持状态保存和恢复需要修改应用程序委托和视图控制器对象进行编码和解码的状态信息。如果您的应用程序具有任何也具有可保存状态信息的自定义视图,则还需要修改这些对象。

向代码添加状态保存和恢复时,使用以下列表来提醒您需要编写的代码。

  • (必需)实现应用程序:shouldSaveApplicationState:和 应用:shouldRestoreApplicationState:在您的应用程序 委托方法;请参阅在您的 应用程序中启用状态保存和恢复。
  • (必填)为每个视图控制器分配恢复标识符 通过向其分配非空字符串来保留
    restorationIdentifier属性;请参阅标记您的视图控制器 保存。

    如果您还想保存特定视图的状态,请将非空 字符串分配给它们的restoreIdentifier属性;请参阅保留您的视图的状态 。

  • (必填)从​​ 应用程序显示您的应用程序窗口:willFinishLaunchingWithOptions:您的应用程序的方法 委托。状态恢复机器需要窗口,以便它可以恢复应用程序的界面的滚动位置和其他相关位。

  • 将恢复类别分配给相应的视图控制器。 (如果
    您不这样做,则应要求您的应用程序代理在恢复时提供相应的视图控制器。)请参见在启动时恢复您的
    视图控制器。

  • (推荐)编码和解码的使用encodeRestorableStateWithCoder您的视图和视图 控制器的状态:与 decodeRestorableStateWithCoder:这些对象的方法。请参阅 编码和解码您的视图控制器的状态。
  • 编码和解码使用 应用程序的任何版本信息或附加状态 信息:willEncodeRestorableStateWithCoder:和 应用:didDecodeRestorableStateWithCoder:您的应用程序 委托的方法;请参阅保留应用程序的高级状态。

  • 充当表视图和集合视图 的数据源的对象应实现UIDataSourceModelAssociation协议。虽然 不是必需的,但此协议有助于保留这些类型的视图中所选和可见的 项目。参见实施保存友好的 数据源。