【问题标题】:NSUserdefaults global defaultsNSUserdefaults 全局默认值
【发布时间】:2011-12-08 06:59:22
【问题描述】:

我正在制作一个添加了设置的应用程序(nsuserdefaults)

问题出在我的主视图控制器中,我声明了用户默认值并获取其值。 但是,由于在用户进入设置并返回应用程序后不会调用 viewdidload。 我的设置没有更新。

我尝试在应用程序委托 applicationwillenterforeground 中声明用户默认值 但我将如何将消息传递给 mainviewcontroller。

应用委托中定义的变量在主视图控制器中无法识别。

更新:我已经声明

- (void)applicationWillEnterForeground:(UIApplication *)application
{
NSUserDefaults *prefs = [NSUserDefaults  standardUserDefaults];
}

我在设置中有切换开关,它有标识符 enabled_preference 所以我写了

   else
{
    [PlaySound prepareToPlay];      
    [prefs setBool:YES forKey:@"enabled_preference"];
    BOOL loop = [prefs boolForKey:@"enabled_preference"];
    NSLog(@" %d",loop);
    do {
          [PlaySound play];
    } while (loop ==YES);

它在控制台中记录 0 但是我在 plist 中将默认设置为 yes

【问题讨论】:

    标签: iphone objective-c ios cocoa-touch


    【解决方案1】:

    如果您将对象设置为 NSUserDefaults,您可以在应用程序中的任何位置使用。无需在 appDelagate 中创建对象...

    [[NSUserDefaults standardUserDefaults] setObject:@"Ramu" forKey:@"iCustomerId"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    

    您可以使用下面的行在整个应用程序中获取该值

    [[NSUserDefaults standardUserDefaults] valueForKey:@"iCustomerId"]
    

    【讨论】:

    • 感谢您的回复。现在2个问题。我已经在视图中声明了用户默认值确实加载了。我可以访问它flipsideviewcontroller。?其次,我在具有标识符 enabled_preference 的设置中有切换开关,所以我写了 BOOL loop = [prefs boolForKey:@"enabled_preference"]; NSLog(@" %d",循环);它在控制台中记录 0 但是我在 plist 中将默认设置为 yes
    • 我没有明白你的意思...正如我所说,不需要在 viewdidload 或 viewwillappear 中声明任何对象,只需使用两个选项..1.setbool forkey 和 2.boolForkey
    • 如果我没有放 NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];在 viewdidload 和它之外.. 它是说初始化元素不是编译时间常数。我真正的问题是 boolforkey 返回 0 而默认为 1
    • 默认返回 NO 表示 0 如果设置为 YES 则返回 1(YES)
    • 我知道它会返回 1 是的 .. 但这就是问题所在。在我的设置 root.plist 我已将默认设置为是。但它仍然为它返回 0。???
    【解决方案2】:

    当您弹出时,您的 ViewDidLoad 不会被调用。 您需要在

    中编写该代码

    ViewWillAppear

    每次访问该视图控制器时都会调用它。

    【讨论】:

    • 感谢您的回复。现在2个问题。我已经在视图中声明了用户默认值确实加载了。我可以访问它flipsideviewcontroller。?其次,我在具有标识符 enabled_preference 的设置中有切换开关,所以我写了 BOOL loop = [prefs boolForKey:@"enabled_preference"]; NSLog(@" %d",循环);它在控制台中记录 0 但是我在 plist 中将默认设置为 yes
    • viewWillAppear 不太合适。在很多情况下,当你需要它时它不会被调用,而在其他情况下,它会被比你想要的更频繁地调用。
    • 是的,会被调用,你甚至可以像 Abhi 所说的那样使用通知。一切都取决于你想如何访问和使用..
    • @Abhi Beckert,您可能是对的,但无需注册任何通知即可完成此操作,这一切都取决于他想要使用的方式....通知在 ViewWillAppear 中有自己的位置有自己的位置.....
    【解决方案3】:

    任何对象都可以为应用程序注册自己成为活动通知。只需在您的 MainViewController 中执行此操作:

    @implementation MainViewController
    
    - (void)viewDidLoad
    {
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
    }
    
    - (void)dealloc
    {
      [[NSNotificationCenter defaultCenter] removeObserver:self]; // your app may crash randomly if you don't do this
    
      [super dealloc];
    }
    
    - (void)applicationDidBecomeActive:(NSNotification *)notification
    {
      // check user defaults for changes
    }
    
    @end
    

    根据您的应用程序的结构,这个特定的 applicationDidBecomeActive: 方法可能会或可能不会在您的应用程序首次启动时被调用,您必须进行检查,但之后总是会调用它。

    【讨论】:

    • 感谢您的回复。现在2个问题。我已经在视图中声明了用户默认值确实加载了。我可以访问它flipsideviewcontroller。?其次,我在具有标识符 enabled_preference 的设置中有切换开关,所以我写了 BOOL loop = [prefs boolForKey:@"enabled_preference"]; NSLog(@" %d",循环);它在控制台中记录 0 但是我在 plist 中将默认设置为 yes
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多