问题标签 [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 投票
1 回答
75 浏览

ios - 可以运行一个应用程序然后重新启动 iPhone 吗?

我有一个 iOS Objective-C 应用程序,它实现了商店恢复功能。但是如果我在我的应用程序运行时重新启动我的 iPhone ......他们在重新启动之前继续工作吗?

我正在尝试重新启动我的 iPhone,并且后台的应用程序继续在后台运行,但是当我将一些应用程序带到前台时,它们会显示启动屏幕,就像我第一次打开它们一样。如何确保在重新启动之前调用应用程序状态?

0 投票
0 回答
227 浏览

objective-c - 如何对观察到的属性进行状态恢复

我有一个基于文档的 Cocoa 应用程序,我想为其实现状态恢复。具体来说,我的 NSDocument 子类包含一个需要保留其某些属性的控制器对象。问题是其中一个窗口控制器在控制器恢复之前将自己注册为控制器的观察者。因此,当控制器恢复时,应用程序会抛出异常,因为它试图在默认控制器已被观察时释放它。

DataController 类的实例 0x600000001ba0 已被释放,而键值观察者仍向其注册。

我创建了一个重现问题的最小示例。结构如下:

您可以从此处下载示例项目,以便更轻松地设置所有内容:https ://github.com/mpflanzer/restoration_example

简单地Document创建MainWindowController

并编码/恢复其 dataController 属性

在方法MainWindowController中将自己注册为观察者并在. 那是如何正确地做到这一点?还是应该使用其他功能来添加或删除观察者?windowDidLoadwindowWillClose

由于应用程序已经失败,目前DataController没有做任何特别的事情。后来它显然必须实施initWithCoder以恢复其属性。

当我运行示例(并触发状态恢复)时,我得到以下日志输出:

存在的问题是,makeWindowControllers因此在恢复windowDidLoad之前被调用。Document鉴于该顺序,MainWindowController将注册为观察者,然后Document才会尝试将其dataController属性恢复到已保存状态。

我如何实施状态恢复有什么问题吗?或者以我添加/删除观察者的方式?我本来希望Document先恢复,然后才makeWindowControllers调用。

0 投票
2 回答
216 浏览

ios - iOS - 状态恢复 - 获取以前恢复的视图控制器

我有一个导航控制器,里面有几个视图控制器。

在恢复application(_:viewControllerWithRestorationIdentifierPath:coder:)每个控制器的应用程序方法调用时,最初是堆栈中的第一个,然后是第二个,依此类推。在恢复第二个视图控制器时,我需要参考第一个(在它们之间建立一些联系)。

有没有办法在此步骤中获取先前恢复的控制器,而无需将此控制器保存在应用程序的某个位置?(关于导航控制器也是如此,我不会在应用程序的任何地方保存对它的引用)

0 投票
0 回答
62 浏览

ios - 恢复 UICollectionViewCell

我已将 restoreIdentifier 分配给 UICollectionViewCell 的子类当应用程序移动到后台encodeRestorableState(with coder: NSCoder)被调用时,但当应用程序恢复decodeRestorableState(with coder: NSCoder)未被调用时。

我试图将 restoreIdentifier 分配给 UICollectionView 但它也无济于事。我应该怎么做才能让它工作?

0 投票
2 回答
1308 浏览

ios - 状态恢复工作但随后在 viewDidLoad 中无效

注意代码已更新以包含评论中详述的修复,但这里是原始问题文本:

状态恢复在下面基于代码的 ViewController 上工作,但随后通过对 viewDidLoad 的第二次调用“撤消”。我的问题是:我该如何避免这种情况?有一个断点decodeRestorableState我可以看到它确实恢复了 2 个参数selectedGroupselectedType但随后它再次通过 viewDidLoad 并且这些参数被重置为 nil,因此恢复无效。没有情节提要:如果您将此类与空的 ViewController 相关联,它将起作用(我仔细检查了这一点——也有一些按钮资产,但功能不需要它们)。我还在底部包含了启用状态恢复所需的 AppDelegate 方法。

以下是 AppDelegate 中的函数:

0 投票
1 回答
2009 浏览

ios - Can't get State Restoration to work with Programmatic Navigation Controller

I'm unable to get State Restoration working with a Navigation Controller. I am using Swift and do not want to use Storyboards (Programmatic). Almost all the help I've found online is either not in Swift or using Storyboards.

In the demo code below, ViewController contains a simple PickerView, and a selection variable keeps track of the Picker selection. The AppDelegate is presented with 2 options. With Option 1, no Navigation Controller is used and the state of the Picker is restored fine, but is not restored with the Navigation Controller in Option 2. (In the code below, Option 1 is commented out and Option 2 is active).

You can copy & paste the code below into a fresh singleView application and it should reproduce what I've described. (I tested it)

AppDelegate Code:

ViewController Code:

Details of my testing: With Option 1, changing the Picker followed by cmd-Shift-H causes the selection variable to be saved in encodeRestorableState. I then click the Xcode Stop button and then run it again, and the selection variable is restored in decodeRestorableState. By contrast, with Option 2 State restoration does not work because decodeRestorableState is never called so the selection variable is not restored. However, a breakpoint at viewDidAppear shows that navigationController?.restorationIdentifier = "PickerNav" and restorationIdentifier = "PickerVC"

From what I've read, I suspect I may need to use viewControllerWithRestorationIdentifierPath in AppDelegate, but I didn't know how to use it correctly. My attempt at the bottom of AppDelegate (the code is commented out) causes the app to crash.

0 投票
1 回答
335 浏览

ios - UICollectionView状态恢复:恢复所有UICollectionViewCells

我通过谷歌和SO搜索了很多,所以请原谅我,如果这个问题已经回答了!

问题: 我有一个UICollectionViewwith n UICollectionViewCells。每个单元格都包含一个UIView来自 XIB 文件的内容。视图用于数据输入,因此所有单元格都有一个唯一的reuseIdentifier. 每个 View 也有一个独特的restorationIdentifier. 一切正常使用,但在状态恢复时却不行:

前 3 或 4 个单元格正在正确恢复,因为它们在启动时在屏幕上可见,但其余不可见的单元格没有得到恢复。

当前解决方案: 所以到目前为止,我发现只有在启动时将视图添加到用户界面时才会恢复视图。我目前的工作解决方案是在恢复过程中将所有单元格的高度设置为 1。现在每个单元格都已加载,所有视图都已恢复。当applicationFinishedRestoringState()被调用时,我用正确的高度重新加载 CollectionView。

现在我的问题是:我对这个解决方案不满意,有没有更干净的方法来实现所有 UIView 的恢复?

0 投票
1 回答
2213 浏览

ios - 为什么我的 iOS 应用程序在返回前台模式后会从第一个屏幕重新启动?

当在详细屏幕中的我的 iOS 应用程序中时,我按下主页按钮,这将导致它进入后台模式。在 7 分钟左右不活动后,我重新启动它,但它并没有从我离开它的地方开始。它从第一个屏幕开始。

我上网,开始了解国家保护和恢复。我在一个屏幕上实现了,但它似乎不起作用。这就是我在 appDelegate.m 中所做的

以下代码在 appDelegate.m 中的 willFinishLaunchingWithOptions 方法中。我没有使用故事板,因为这个应用程序很旧。它有XIB。所以这个应用程序总是需要进入登录屏幕,检查是否存储了 accessToken,它将从登录屏幕进入主屏幕。如果未存储,它将保留在登录屏幕中。所以这是强制执行的。因此,只有一种方法可以像下面这样编码。

我已经在 viewDidLoad() 中为所有视图控制器提供了 restoreId,如下所示。例如,这就是我在 PetDetailViewController.m 中所做的

现在,当我进入 PetDetail 屏幕并按下主页按钮时,将调用 encodeRestorableStateWithCoder()。从 xcode 停止应用程序,重新启动它会停留在同一屏幕上,但会立即进入登录屏幕并转移到主屏幕(willFinishLaunchingWithOptions 中的代码可能正在执行)

我做错什么了吗?除非用户手动杀死它,否则如何防止应用程序从第一个屏幕重新启动?

0 投票
1 回答
117 浏览

ios - CoreBluetooth 在重新连接时重新订阅特征

在我的应用程序中,我能够成功连接到 BLE 外围设备并订阅一个特性,以便在特性值发生变化时通知应用程序。但是在状态恢复期间重新初始化中央管理器后,应用程序不会收到特征值变化的通知。以下是我在状态恢复期间所做的事情:

  • 在 didFinishLaunchingWithOptions: 我用恢复标识符重新实例化中央管理器对象。
  • 然后在 centralManager:willRestoreState: 方法中,我检索以前连接的外围设备并使用
    CBCentralManagerRestoredStatePeripheralsKey 重新连接到它们。

将简单地重新连接到外围设备将在内部进行特征订阅或查找服务并订阅要明确完成的特征,就像在首次启动期间完成的那样?

0 投票
0 回答
326 浏览

ios - 使用递归指针编码和解码自定义 Swift 对象

我正在尝试快速编码和解码一组自定义对象。这些对象看起来像这样:

如果 MyObject A 在其数组中包含 MyObject B,则 B 在其数组中也将包含 A。问题是,如上所述,这在启动过程中失败,无法执行此递归解码。使用调试器单步执行,看起来像

  1. 该应用程序尝试解码 A
  2. 在解码A时,它必须解码A的others数组,其中包含B
  3. 应用程序现在必须解码 B。这样做时,它会看到 A 在 B 的others数组中。
  4. 应用程序开始解码 A(B 的编码表示指向的 A),并在尝试这样做时失败。

使用这种方法,我似乎没有保留原始状态(即解码后,A 和 B 不是指向彼此,而是指向彼此的副本)。使用 NSCoder 对像我这样的数据结构进行编码和解码的推荐方法是什么?