【问题标题】:iOS state restoration animation bugiOS 状态恢复动画错误
【发布时间】:2014-12-15 04:50:22
【问题描述】:

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

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

日志中还有一个警告:

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

你能告诉我是我和 Apple 的示例代码做错了什么,还是 iOS 中的错误?

顺便说一句。我在 iOS8 上测试

感谢您的帮助, 乔治

【问题讨论】:

    标签: ios state-restoration


    【解决方案1】:

    来自文档: Preserving Your App’s Visual Appearance Across Launches

    请参阅下面清单中的第 3 项。

    实施状态保护和恢复的清单

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

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

    • (必需)实现应用程序:shouldSaveApplicationState:和 application:shouldRestoreApplicationState: 应用中的方法 代表;请参阅在您的 应用。
    • (必需)为您的每个视图控制器分配恢复标识符 想通过为其分配一个非空字符串来保存
      恢复标识符属性;请参阅标记您的视图控制器 保存。

      如果您也想保存特定视图的状态,请指定非空 字符串到他们的 restoreIdentifier 属性;见保存 您的观点。

    • (必需)从 application:willFinishLaunchingWithOptions: 应用的方法 代表。国家恢复机器需要窗口,以便它 可以恢复应用程序的滚动位置和其他相关位 界面。

    • 将恢复类分配给适当的视图控制器。 (如果
      如果您不这样做,则要求您的应用委托提供
      恢复时对应的视图控制器。)请参阅恢复您的
      在启动时查看控制器。

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

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

    【讨论】:

      【解决方案2】:

      Apple 示例代码似乎在 Xcode 8 上运行良好。

      所以我想不需要额外的代码更改

      【讨论】:

        【解决方案3】:

        以下解决方案直接来自 Apple。

        在您的应用委托中,您应该实现application:willFinishLaunchingWithOptions:(代替didFinishLaunching 或除didFinishLaunching 之外)。在您的实现中,可能作为返回 true 之前的最后一行(如果这是 Objective-C,则为 YES),插入以下行:

        self.window?.makeKeyAndVisible()
        

        或者,如果这是 Objective-C:

        [self.window makeKeyAndVisible];
        

        事实证明这是总是需要的,但文档从来没有明确过。

        【讨论】:

        • 您引用的 Apple 相同代码现在实际上是这样做的,所以我不确定您为什么会在那里看到问题。
        • 是的。向问题添加赏金有效! Apple 代码在 didFinishLaunchingWithOptions 中调用 makeKeyAndVisible 而不是 willFinishLaunchingWithOptions。将其移至willFinishLaunchingWithOptions 可使一切正常运行。谢谢!我会在 23 小时内奖励赏金(Stack Overflow 现在不允许我这样做)。
        • @bogdansrc 你的眼睛比我的还敏锐!您完全正确:Apple 示例代码在错误的地方做了正确的事情,这就是它没有解决问题的原因。有趣的是,他们在该行之前插入的注释清楚地表明他们认为他们把它放在了正确的位置:“要求在状态恢复之前窗口是可见的。”正是如此;但是“状态恢复之前”是指willFinish结束之前!这就是该代码的全部意义所在!提交一份错误报告是值得的(如果你愿意的话)。
        • Apple 从来不想为我提交的报告修复错误,所以我不再想提交它们。感谢您的帮助!
        • @bogdansrc 我知道你的感受。然而,我给你的解决方案来自 Apple 对我自己关于这个问题的错误报告的回应——所以你看,错误报告有时确实有效。
        猜你喜欢
        • 1970-01-01
        • 2015-12-24
        • 2013-10-25
        • 2011-04-06
        • 2013-08-29
        • 2012-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多