【问题标题】:Opening app from last opened UIViewController从上次打开的 UIViewController 打开应用程序
【发布时间】:2013-01-09 05:27:43
【问题描述】:

我需要我的应用记住上次打开的 UIViewController 是哪个,所以当应用加载到内存不足时,我将 AppDelegate 中的 rootViewController 属性替换为 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;
}

我想做的是在每个ViewControllerViewDidLoad 方法中放入一些代码,并在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.

关于如何实施这整个事情的任何想法对吗?提前致谢

【问题讨论】:

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


    【解决方案1】:

    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
    

    【讨论】:

      【解决方案2】:

      根据文档:

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

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

      【讨论】:

        【解决方案3】:

        您只能将符合 Key-Value 编码(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];
        

        【讨论】:

        • 编译器如何知道什么是'classStringSavedInUserDefaults'?
        • 这有帮助!非常感谢!
        • 它不保存 UIViewcontroller 中存在的控件值。例如,如果我有一个值为“sample”的 UITextField,那么它不会恢复该值。有什么方法可以保存控件及其值
        • 您可以在 NSUserDefaults 中保存其他值,并在您的视图控制器加载时加载它们。
        【解决方案4】:

        首先你不能在 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;
        

        【讨论】:

          猜你喜欢
          • 2014-04-02
          • 1970-01-01
          • 2021-12-22
          • 1970-01-01
          • 1970-01-01
          • 2021-03-03
          • 2022-11-11
          • 1970-01-01
          • 2011-04-08
          相关资源
          最近更新 更多