2

我需要我的应用程序记住上次UIViewController打开的应用程序,因此当应用程序加载到内存不足时,我用保存的一个rootViewController属性替换:AppDelegateNSUserDefaults

- (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;
}

我想做的是在ViewDidLoadeach 的方法中放入一些代码ViewController并记住它的名称NSUserDefaults以便以后在 中使用它didFinishLaunchingWithOptions,如下所示:

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

然而,问题是 XCode 给了我这个警告:

*** -[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '<SGMainScreenFirstTimeViewController: 0x8e1fea0>' of class 'SGMainScreenFirstTimeViewController'.  Note that dictionaries and arrays in property lists must also contain only property values.

关于如何实施这整件事的任何想法?提前致谢

4

4 回答 4

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];
于 2013-01-25T09:18:35.117 回答
0

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

更好的方法来完成功能。

[[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
于 2013-01-25T09:15:46.447 回答
0

根据文档:

value 参数只能是属性列表对象:NSData, NSString, NSNumber, NSDate, NSArray, 或NSDictionary. 对于NSArrayandNSDictionary对象,它们的内容必须是属性列表对象。

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

于 2013-01-25T09:16:36.723 回答
0

首先是你不能在 NSUserDefaults 中保存可变值。只需检查以下伪代码:

[[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;
于 2013-01-25T09:21:36.343 回答