【问题标题】:NSUserDefaults remember viewNSUserDefaults 记住视图
【发布时间】:2012-11-21 22:47:29
【问题描述】:

我的应用程序包含几个视图,我想在应用程序启动并且用户尚未完成向导时显示一个小设置。 我知道我可以使用 NSUserDefaults 实现这一点,但我不确定如何根据 NSUserDefaults 存储的输入字符串显示特定视图。

我的 AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    NSString *controllerName = [[NSUserDefaults standardUserDefaults] objectForKey:@"WIZARD_VIEW"];
    if ([controllerName length]) {
        Class controllerClass = NSClassFromString(controllerName);
        UIViewController *controller = [[controllerClass alloc] init];

    // Override point for customization after application launch.
    return YES;
    }

然后在 viewcontroller 文件中,我添加了以下代码作为 jfaller 的建议:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSUserDefaults* standard=[NSUserDefaults standardUserDefaults];
    [standard registerDefaults: @{ @"WIZARD_VIEW" : [[self class]description]} ];    [[NSUserDefaults standardUserDefaults] synchronize];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSUserDefaults* standard=[NSUserDefaults standardUserDefaults];
    [standard registerDefaults: @{ @"WIZARD_VIEW" : [[self class]description]} ];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

但是我怎样才能使它显示在设置中选择的特定视图?

【问题讨论】:

  • 你不想在这里调用 registerDefaults:。通常每次应用程序启动只调用一次 registerDefaults。你真的想调用 setObject:forKey:.

标签: iphone objective-c xcode nsuserdefaults


【解决方案1】:

就个人而言,我会做以下事情:

每次用户在向导中进入新视图时,在用户默认值中记录 UIViewController:

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];
  [[NSUserDefaults standardUserDefaults] setObject:[[self class] description] forKey:WIZARD_VIEW];
  [[NSUserDefault standardUserDefaults] synchronize];
}

- (void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];
  [[NSUserDefaults standardUserDefaults] removeObjectForKey:WIZARD_VIEW];
  [[NSUserDefault standardUserDefaults] synchronize];
}

当用户重新启动应用程序时(假设在向导中间),重新加载视图:

- (BOOL)application:(UIApplication *)application
    willFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // etc.
  NSString *controllerName = [[NSUserDefaults standardUserDefaults] objectForKey:WIZARD_VIEW];
  if ([controllerName length]) {
    Class controllerClass = NSClassFromString(controllerName); 
    NSViewController *controller = [[controllerClass alloc] init];
    // push the controller, or whatever....
  }
  // etc.
}

【讨论】:

  • 在我接受这个作为答案之前(因为它几乎完成了这项工作),您能否让“willFinishLaunchingWithOptions”更清楚,因为根据 xcode 确实存在错误,提前感谢您的大力帮助!跨度>
  • 更具体地说,我正在使用 ARC,它给出了以下错误:“ARC 不允许从 int 到类的隐式转换”-“objc_lookUpClass 在 C99 中无效”等等。 .
  • 尝试:类 controllerClass = NSClassFromString(controllerName);它不需要标题和其他一些 ARC 抱怨的东西。
  • 使用固定代码我的整个应用程序将不再启动。请查看我的第一个更新帖子,在此先感谢。
  • 有点难以理解,“我的应用程序不会再启动了。”还有其他提示吗? :) 除此之外,您必须对您使用 alloc/init 创建的 UIViewController 进行实际操作。例如,如果你有一个 UINavigationController 应用,你需要推送视图控制器等。
【解决方案2】:

在视图加载时将您所在的视图写入 NSUserDefaults。然后检查didFinishLaunchingWithOptions中的值。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([[[NSUserDefaults standardUserDefaults] valueForKey:@"current_setup"] isEqualToString:@"1"]) {

         //on view 1!   

    }

}

【讨论】:

  • 当我下次使用情节提要时,如何才能让它正确启动?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 2014-07-29
  • 1970-01-01
相关资源
最近更新 更多