我有另一个关于在 iPhone 上恢复应用程序状态的问题。简单的数据(比如选择的标签)可以存储在 NSUserDefaults 中,但这还不够。
我想恢复整个状态,包括导航控制器(转到子子视图控制器)。
我的问题是我的应用程序被分成了几个xib文件,所以一开始所有的View Controller都没有实例化。有没有办法从 xib 文件中“强制”实例化?
(我手下没有代码,不过看不清楚可以尝试写一个小端)
非常感谢。
我有另一个关于在 iPhone 上恢复应用程序状态的问题。简单的数据(比如选择的标签)可以存储在 NSUserDefaults 中,但这还不够。
我想恢复整个状态,包括导航控制器(转到子子视图控制器)。
我的问题是我的应用程序被分成了几个xib文件,所以一开始所有的View Controller都没有实例化。有没有办法从 xib 文件中“强制”实例化?
(我手下没有代码,不过看不清楚可以尝试写一个小端)
非常感谢。
调用[viewController view]
将确保加载给定视图控制器的 XIB;一旦它是,您可以正常使用它的任何其他属性。
这是我倾向于做的事情:
@class Record; // some model object--I assume it has an integer record ID
@class DetailViewController;
@interface RootViewController : UIViewController {
IBOutlet DetailViewController * detailController;
}
- (void)restore;
...
@end
@implementation RootViewController
// Note: all detailController showings--even ones from within
// RootViewController--should go through this method.
- (void)showRecord:(Record*)record animated:(BOOL)animated {
[self view]; // ensures detailController is loaded
[[NSUserDefaults standardUserDefaults] setInteger:record.recordID
forKey:@"record"];
detailController.record = record;
[self.navigationController pushViewController:detailController
animated:animated];
}
- (void)restore {
int recordID = [[NSUserDefaults standardUserDefaults] integerForKey:@"record"];
if(recordID) {
Record * record = [Record recordWithID:recordID];
[rootViewController showRecord:record animated:NO];
// If DetailViewController has its own state to restore, add this here:
// [detailController restore];
}
}
...
- (void)viewDidAppear:(BOOL)animated {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"record"];
}
@end
@implementation MyAppDelegate
- (void)applicationDidFinishLaunching:(UIApplication*)application {
...
[rootViewController restore];
...
}
...
@end
视图层次结构的每个级别都负责自己的状态保存,因此应用程序控制器不必知道所有可能的视图以及它们可能处于哪些顺序。
我在我的应用程序 Litho Graph 中执行此操作。如果您在退出时位于某个页面上,那么在您下次启动时,它会将您恢复到该页面。这也很简单:在我的主视图控制器的 -viewDidLoad 实现中,我检查用户默认值中的最后一页查看键。如果什么都没有,我会照常继续(并显示所有页面的列表)。如果有什么,我打开那个页面(将新的视图控制器推到导航控制器堆栈上)。
视图控制器的实际加载非常简单:我只是实例化它们。我的每个视图控制器类都覆盖了 -init 以在 super 上调用 -initWithNibName:bundle:,因此调用 +alloc 和 -init 来创建视图控制器实例足以从适当的 .xib 文件中加载它。然后,如上所述,我将其推送到导航控制器的堆栈中:
[self.navigationController pushViewController: controller animated: YES];
当然,您可以根据需要执行任意多个层,但请记住,如果要进行多个转换,您可能希望在没有动画的情况下推送视图控制器;用户必须等待几个动画会适得其反(:
查看苹果“drilldownsave”示例代码。做你想要的