从上次打开的UIViewController打开应用程序

时间:2013-01-25 09:11:01

标签: iphone ios objective-c cocoa-touch uiviewcontroller

我需要我的应用记住哪个是最后UIViewController打开的,所以当应用加载内存不足时,我会替换rootViewController中的AppDelegate属性,其中一个保存在{ {1}}:

NSUserDefaults

我想要做的是在每个- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window = window; frontViewController = [[SGLoginScreenViewController alloc] init]; UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:frontViewController]; self.window.rootViewController = navController; [self.window makeKeyAndVisible]; return YES; } 的{​​{1}}方法中添加一些代码并在ViewDidLoad中记住它的名称,以便稍后在ViewController中使用它像这样:

NSUserDefaults

但问题是,XCode正在给我这个警告:

didFinishLaunchingWithOptions

关于如何实现这一切的任何想法都正确吗?提前致谢

4 个答案:

答案 0 :(得分:8)

您只能保存符合键值编码(NSString,NSnumber等)的用户默认对象。将类转换为字符串并重新创建知道类名的类将是您希望实现的目标。 这是在NSUserDefaults中保存的好方法

[[NSUserDefaults standardUserDefaults] setObject:NSStringFromClass([self class]); forKey:@"currentViewController"];
[[NSUserDefaults standardUserDefaults] synchronize]; 

对于加载,您可以根据保存的字符串重新创建类,如下所示:

NSString *savedClassName = [[NSUserDefaults standardUserDefaults] objectForKey:@"currentViewController"];
UIViewController *controller = [(UIViewController *)NSClassFromString(savedClassName) alloc] init];

答案 1 :(得分:0)

NSUSerDefaults基本上是存储默认值...不是大对象(可以保存的项目列表包括(NSString,NSData,NSDictionary,NSArray,NSNumber) ..keep记住下一次。

更好的方法来实现功能。

[[NSUserDefaults standardUserDefaults] setObject:@"Second View" forKey:@"currentViewController"];
[[NSUserDefaults standardUserDefaults] synchronize]; 

然后在应用加载

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"currentViewController"] isEqualToString:@"Second View"])
{
//your code/logic

答案 2 :(得分:0)

根据文件:

  

value参数只能是属性列表对象:NSDataNSStringNSNumberNSDateNSArrayNSDictionary。对于NSArrayNSDictionary个对象,其内容必须是属性列表对象。

因此,您可以保存视图控制器的名称,并在启动时将其恢复,并知道其名称

答案 3 :(得分:0)

首先,您无法在NSUserDefaults中保存可变值。只需检查下面的psudocode:

[[NSUserDefaults standardUserDefaults] setObject:@"nibnameofcurrentViewController" forKey:@"currentViewController"];
[[NSUserDefaults standardUserDefaults] synchronize]; 

当您的应用再次启动时,请执行以下操作:

UIViewController *controller=[[UIViewController alloc]initWithNibName:[[NSUserDefault standerdDefault]objectForkey:@"currentViewController"] bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:frontViewController];
self.window.rootViewController = navController;