问题标签 [state-restoration]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2719 浏览

ios - 为什么我的应用在恢复后没有返回到我的详细视图?

我的应用程序有一个简单的组织,我已在 Interface Builder 故事板中配置(不是在代码中)。有一个导航视图控制器,它的根视图控制器设置为我的主视图控制器。我的主视图包含一个表格,其中单元格连接到详细视图控制器。

当我在查看详细信息视图时暂停应用程序然后恢复它时,我将返回到主视图,而不是详细信息视图。为什么会这样?

细节:

我在界面生成器中为导航视图控制器、主视图控制器和详细视图控制器设置了恢复 ID。我还尝试将恢复 ID 添加到表视图并使主视图控制器实现 UIDataSourceModelAssociation。

我的应用程序从 shouldRestoreApplicationState 返回 YES 并且主视图和详细视图都有 encode/decodeRestorableStateWithCoder 方法。

我正在使用模拟器测试挂起/恢复:我运行应用程序,导航到详细信息视图,点击主页按钮,然后单击 XCode 中的停止按钮。为了恢复,我再次从 XCode 运行该应用程序。

我在挂起时看到以下调用:

在简历上:

除了恢复错误的视图之外,还有一些奇怪的地方:为什么详细视图的恢复标识符路径是“Navigation/DetailView”而不是“Navigation/MainView/DetailView”?Navigation View Controller 和 Detail View Controller 之间没有直接关系。它们在 Interface Builder 中的唯一连接是通过 Main View 中的 segue。

我是否配置错误?

我尝试将恢复类分配给详细信息视图。调用该恢复代码时,它会失败,因为未在编码器中设置 UIStateRestorationViewControllerStoryboardKey。

这是我的项目的玩具版本,它复制了这个问题:https ://github.com/WanderingStar/RestorationTest

我正在尝试使用 XCode 版本 5.0 (5A1413) 和 iOS 模拟器版本 7.0 (463.9.4),以防万一。

0 投票
3 回答
7451 浏览

ios - iOS中的状态恢复

我正在存储我的应用程序屏幕,以便在打开应用程序时它会显示存储的屏幕。该应用程序是基于导航的。

我已将恢复 ID 分配给主故事板中的两个视图控制器。第一个控制器是导航控制器的根视图控制器。我还为导航控制器分配了恢复 ID。现在的问题是当我运行应用程序时,我收到以下警告:

无法创建正在进行中的恢复标记文件。

不确定还需要做什么。

0 投票
3 回答
7584 浏览

ios - 核心蓝牙状态保存和恢复不起作用,无法将应用重新启动到后台

我试图让核心蓝牙唤醒应用程序,即使它没有运行。

正如 Apple 所说,“由于 Core Bluetooth 内置了状态保存和恢复功能,您的应用程序可以选择加入此功能,以要求系统保留您的应用程序的中央和外围管理器的状态,并继续执行某些与蓝牙相关的任务。代表他们,即使您的应用程序不再运行。当其中一项任务完成时,系统会将您的应用程序重新启动到后台,并让您的应用程序有机会恢复其状态并适当地处理事件。

我添加了以下代码以选择加入此功能:

但是应用程序被唤醒时的回调从未被触发。

这两个永远不会被调用。

我测试这个唤醒功能的方式:

  1. 我在 info.plist 的后台模式中添加了“蓝牙中央”,因此 BLE 在后台运行。

  2. 在我的 iphone 1 中启动 centralManager。开始扫描。

  3. 按回家然后出去,玩一些内存重的游戏,在调试日志中我会看到:“由于内存压力而终止。进程以退出代码 0 完成”。这是为了模拟ios系统如何因内存压力而终止后台应用程序。

  4. 用另一个 iphone No.2 启动一个信标并开始广播。

  5. 结果:那些重新启动的回调永远不会被调用。

任何想法为什么这不起作用?如果是 API 问题,当您的手机接近 BLE 信标时,是否有任何其他方法可以使用 BLE 将您的应用重新启动到后台?我尝试过使用 ibeacon 来唤醒应用程序,但核心蓝牙中央管理器不允许您在后台连接到 ibeacon。

谢谢!

0 投票
0 回答
631 浏览

ios - iOS 状态恢复丢弃导航栈

tl;dr 状态恢复过程似乎正在发生,但在恢复完成后,堆栈(非根)视图控制器不会在应用程序中结束。

我正在尝试在不使用任何 .nib 或情节提要的应用程序中实现状态恢复。这是一个相当基本的结构:窗口rootViewControllerUINavigationController其自己的rootViewController和所有其他子视图控制器UITableViewControllers(例如,Window > Nav Ctrl > Table View Ctrl > Table View Ctrl > 等)。没有一个视图控制器是重复的(即堆栈上的每个项目都是一个不同的UITableViewController子类)

由于我没有使用情节提要创建视图控制器,因此我为每个视图控制器类设置了指定的初始化程序restorationIdentifierrestorationClass.

当应用程序正在恢复时,我看到应用程序进入后台时存在的每个视图控制器(例如,导航控制器、播客列表控制器和播客详细信息控制器)都发生了解码,但最终结果是恢复始终是导航控制器与其正常的根视图控制器(播客列表控制器)一起显示。

这个问题似乎与这个问题非常相似,但我肯定会在我的视图控制器(如果存在)上调用super-encodedecodeRestorableStateWithCoder:方法,因此该解决方案对我没有帮助。

我观看了 WWDC 视频并阅读了许多教程,虽然我似乎满足了所有要求,但有些事情并没有按应有的方式工作。

我唯一能想到的就是恢复正在发生,但我的默认初始化代码是将恢复的导航视图控制器堆栈替换为仅包含根的“新”堆栈。根据 WWDC 视频,窗口和根视图控制器应在状态恢复之前正常设置,并且不应影响恢复的最终应用状态。

我想对我来说一个问号是viewControllerWithRestorationIdentifierPath:我的UINavigationController. 应该rootViewController像我一样设置吗?如果没有,还会发生什么?我实际上找不到任何工作示例代码,其中导航控制器正在恢复并且它不是从笔尖或情节提要创建的。除此之外,我很难过。

实现代码

FLAppDelegate.m

FLNavigationController.m

FLPodcastTableViewController.m

FLPodcastEpisodeTableViewController.m

0 投票
1 回答
567 浏览

ios - UIViewController 状态恢复 - 弱关系

UIViewController在 iOS 6 中,Apple 为相关类添加了状态恢复。这允许应用程序在终止时保存状态,并在用户恢复应用程序时恢复状态。

一切似乎都很好,但是我遇到了一个不想适应模式的奇怪场景。

假设我们有两个视图控制器,ViewControllerOne并且ViewControllerTwo,它们都存储了一些成功恢复的任意状态。现在让我们假设它ViewControllerOne有一个delegate属性,那ViewControllerTwo就是委托(这是模态视图控制器的常见模式)。谁负责恢复这种关系?它应该如何存储/恢复?

在我的特殊情况下,不涉及情节提要,通过 restorationClass属性在代码中进行恢复。我的第一个直觉是在 restoreClass 中创建视图控制器时尝试恢复关系,但是由于restorationClass不知道其他现有控制器,它无法完全恢复这种关系。

或者,如果是声明delegate属性的视图控制器,应该恢复关系,那么现在在其他类中恢复的控制器实例如何呢?

简而言之,这似乎是一个记录不充分的场景,我希望有人能对此有所了解。

0 投票
2 回答
284 浏览

ios - 嵌入 Segue 目标视图控制器被排除在 UI 状态恢复之外

我的应用程序使用嵌入 segues 来一次在屏幕上显示多个视图控制器。我正在尝试实现 UIKit 状态恢复,但该框架并没有要求我的嵌入式视图控制器对它们的状态进行编码和解码。这会自动发生在所有其他类型的 segue 中。

UIKit 状态是否可以通过嵌入 segues 恢复?

这是一个演示此问题的示例应用程序:https ://github.com/paulhimes/RestoreEmbeddedTest

0 投票
3 回答
338 浏览

ios - 当应用程序进入后台时设置 NSDate,通过状态恢复保存和恢复它

我的应用程序有一个计时器,当应用程序进入后台时会暂停。
为了在应用程序返回前台时仍然有正确的时间,我设置了如下调用NSDateexitDateAppDelegate

NSDate调用reentryDate如下:

然后我得到两个NSDates 的差异并将它们添加到我的计时器中。

只要应用程序没有在后台终止,这一切都可以正常工作。
如果它确实被终止,则应用程序从第一个 viewController开始并且计时器已停止。

为了解决这个问题,我使用状态恢复。这也可以正常工作。
即使应用程序被终止,该应用程序也会以我之前保存的所有内容重新启动 viewController

唯一似乎没有在状态恢复中得到保存的是我的exitDate,即使我明确要求这样做。

当应用程序返回时,exitDate总是等于 nil。

我认为它与exitDate设置的时间有关,这可能是在调用如下方法之后:

问题是我尝试过设置exitDate,但每次应用程序启动时,-applicationWillTerminate都是零。-applicationDidEnterBackground-applicationWillResignActiveexitDate

有任何想法吗?

0 投票
1 回答
721 浏览

ios - 状态恢复,如何拦截和暂停 SKScene

我正在执行绝对基本的状态保存和恢复,应用程序委托中的代码:

我的应用程序也非常简陋,一个包含 SKScene 的单一视图。这段代码运行得很漂亮,当应用中断时会存储应用和场景的状态,并在重新打开时恢复到之前的状态,可爱。

然而,这是一个动作游戏,所以我想给用户一两秒钟,然后在状态恢复后 SKScene 中的动作再次开始......让他们在事情开始之前让他们的手指重新放在控件上,等等移动......所以,我不知道如何做到这一点,在恢复过程回调中的哪个位置(在场景恢复后,我可以让我的代码暂停所有操作一两秒或任何我想要的,然后重新启动我假设有一个我可以利用的回调方法,但不知道它是什么。

0 投票
1 回答
175 浏览

ios - 在 iOS 中的状态恢复期间未调用应用程序委托 didfinishlaunching

我有几种设置方法对于运行我的应用程序至关重要。他们在应用程序中被调用,代表确实完成了选项。

我正在使用状态恢复,我的应用程序现在失败了,因为当应用程序恢复时,它不会调用此方法。

我可以在哪里移动这些方法以调用状态恢复?

0 投票
0 回答
163 浏览

ios - 在 iOS 的导航控制器中恢复状态以查看时收到错误

当我的应用程序启动时,我收到以下错误:

恢复状态时发生异常找不到 segue 'mySegue' 的导航控制器。只有当源控制器由 UINavigationController 的实例管理时,才能使用 Push segues

这个 segue 连接到导航控制器内部的视图。我的应用导航如下所示:

UITabBarController> 有一个UiNavigationController孩子 >UIViewController在导航控制器中嵌入 > 另一个视图控制器一旦用户单击第一个视图控制器并通过“mySegue”segue 进行转换。

我的导航控制器是一个标准的导航控制器,在界面中看起来像这样:

该实现只有覆盖方法和两种恢复方法:

如果我的 UIViewController 在导航控制器中,为什么我会收到此错误?