【问题标题】:Setting default settings in NSUserDefaults. What I do wrong?在 NSUserDefaults 中设置默认设置。我做错了什么?
【发布时间】:2014-03-31 05:39:23
【问题描述】:

我根据Apple documentation page 使用默认设置制作了自定义 plist 并在 SO 的 answer on question 的帮助下。

这是我的应用委托代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
   NSString *defaultPrefsFile = [[NSBundle mainBundle] pathForResource:@"defaultSettings" ofType:@"plist"];
   NSDictionary *defaultPreferences = [NSDictionary dictionaryWithContentsOfFile:defaultPrefsFile];
   [[NSUserDefaults standardUserDefaults] registerDefaults:defaultPreferences];

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

我还创建了名称为 defaultSettings .plist 的 plist,并在此处存储了我的默认设置。

这是结构:

<dict>
    <key>Sound</key>
    <true/>
    <key>Music</key>
    <true/>
    <key>Difficulty</key>
    <integer>0</integer>
</dict>

在我的设置 VC 中,我从 plist 设置我的出口并在值更改时存储到 plist。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.


    self.soundSwitcher.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"Sound"];

    ....  

    self.difficultySelector.selectedSegmentIndex = [[NSUserDefaults standardUserDefaults] integerForKey:@"Difficulty"];
}

看起来不错,但 outlets 没有设置为我在属性列表本身中设置的默认值。 我也无法通过IBAction 方法更改此值

- (IBAction)switchSound:(UISwitch *)sender
{
    [[NSUserDefaults standardUserDefaults] setBool:sender.isOn forKey:@"Sound"];
}

我做错了什么?

编辑: 我想提一下,如果我关闭设置视图控制器然后再次打开它,设置会在我离开时保存。 (所以,实际上所有的工作)。但是如果我重新启动我的应用程序,所有设置都会取消。

【问题讨论】:

  • 你打电话给synchronize吗?你所有的测试都连接到 Xcode 了吗?您是否在设置默认值以及尝试阅读它们时记录?你在用故事板吗?您是否尝试设置 viewWillAppear: 中的值?
  • @Wain 不,但我现在就试试这个。是的,我的测试连接到 Xcode。是的,我记录(当我打开设置视图控制器时未设置值,例如所有布尔 = 否,整数 = 1,我的 plist 中有另一个集合)。是的,我使用故事板。不,我不会尝试在 viewWillAppear: 中设置网点,但老实说,我不认为,我几乎可以肯定情况并非如此

标签: ios iphone objective-c settings nsuserdefaults


【解决方案1】:

你在更改 NSUserDefaults 中的某些内容后忘记写这个

[defaults synchronize];

【讨论】:

  • 好的,我现在就试试,但是根据文档Because this method is automatically invoked at periodic intervals, use this method only if you cannot wait for the automatic synchronization (for example, if your application is about to exit) or if you want to update the user defaults to what is on disk even though you have not made any changes. 所以我认为这是针对特殊情况的
  • 成功了,我认为我的麻烦在于“快速测试”我几乎在 View Controller 界面中设置值后停止运行项目(延迟大约 3-10 秒),这也是快Because this method is automatically invoked at periodic intervals, use this method only if you cannot wait for the automatic synchronisation。反正有帮助。谢谢。
  • 如果您以用户的方式退出应用程序(在 OSX 上为“退出”,在 iOS 上返回主屏幕)而不是通过 Xcode 中的停止按钮,系统将在退出前处理同步。
猜你喜欢
  • 2018-10-16
  • 2013-01-12
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多