如何保存我的 iPhone 应用程序的用户首选项?

Posted

技术标签:

【中文标题】如何保存我的 iPhone 应用程序的用户首选项?【英文标题】:How do I save user preferences for my iPhone app? 【发布时间】:2010-08-25 13:11:23 【问题描述】:

问题的标题几乎暴露了它 - 我希望我的应用程序能够记住一些事情。它是某种计算器,所以它应该保存上次使用的值和一些用户可选择的设置。

基本上我想保存一些浮点数和布尔值,并在下次加载应用程序时再次加载它们。

最好和最简单的方法是什么?

谢谢!!

【问题讨论】:

【参考方案1】:

最简单的方法之一是将其保存在NSUserDefaults

设置:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

[userDefaults setObject:value 
                 forKey:key];
// – setBool:forKey:
// – setFloat:forKey:  
// in your case 
[userDefaults synchronize];

获取:

[[NSUserDefaults standardUserDefaults] objectForKey:key];

– boolForKey:

– floatForKey: 在你的情况下。

【讨论】:

-setValue:forKey:-valueForKey 也可以。此外,standardUserDefaults 始终在 iDevice 同步时备份。如果您想包含应用内购买,这非常棒。 请注意,synchronize 方法的文档指出该方法是“不必要的,不应使用”。【参考方案2】:

除了非常好的 NSUserDefaults 方法之外,还有另一种简单的方法可以将来自 NSArray、NSDictionary 或 NSData 的数据存储在文件中。您也可以使用这些方法:

- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag

分别(对于 NSDictionary):

+ (id)dictionaryWithContentsOfFile:(NSString *)path

您只需要提供一个有效路径即可。根据 ios 应用程序编程指南,/Library/Caches 目录将是存储您需要在应用程序启动之间持久保存的数据的最佳位置。 (见here)

为了在您的文档目录中存储/加载名为“managers”的文件中的字典,您可以使用以下方法:

-(void) loadDictionary 
    //get the documents directory:
    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cacheDirectory = [paths objectAtIndex:0];
    //create a destination file name to write the data :
    NSString *fullFileName = [NSString stringWithFormat:@"%@/managers", cacheDirectory];
    NSDictionary* panelLibraryContent = [NSDictionary dictionaryWithContentsOfFile:fullFileName];
    if (panelLibraryContent != nil) 
        // load was successful do something with the data...
     else 
        // error while loading the file
       


-(void) storeDictionary:(NSDictionary*) dictionaryToStore 
    //get the documents directory:
    NSArray *paths = NSSearchPathForDirectoriesInDomains
    (NSCachesDirectory, NSUserDomainMask, YES);
    NSString *cacheDirectory = [paths objectAtIndex:0];
    //make a file name to write the data to using the
    //cache directory:
    NSString *fullFileName = [NSString stringWithFormat:@"%@/managers", cacheDirectory];

    if (dictionaryToStore != nil) 
        [dictionaryToStore writeToFile:fullFileName atomically:YES];
    
 

无论如何,这种方法非常有限,如果要存储更复杂的数据,则必须花费大量额外的工作。在这种情况下,CoreData API 非常方便。

【讨论】:

用户偏好并不是真正的文档。 @SK9 :我在第一行中指出,我只是展示了 NSUserDefaults 方法的替代方法。不要对有效的替代方案投反对票是公平/必要的。 例如。从您到文档的链接——“如果您的应用程序创建大型数据文件或 经常更改的文件,您应该考虑将它们存储在 Application Home/Library/Caches 目录中,而不是 /Documents 目录。备份大型数据文件会显着减慢备份过程。定期更改的文件也是如此。将这些文件放在 Caches 目录中可防止在每次同步期间备份它们(在 iOS 2.2 及更高版本中)操作。” @SK9:啊,谢谢,对不起,我误会你了。相应地改变了我的答案。你是对的!【参考方案3】:

在 Swift 中:

设置

let userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setObject(value, forKey: key)

// userDefaults.setFloat(12.34, forKey: "myFloatKey")
// userDefaults.setBool(true, forKey: "myBoolKey")

请注意,对于 iOS 8 及更高版本,调用 userDefaults.synchronize() 是 not recommended。

获取

let userDefaults = NSUserDefaults.standardUserDefaults()
if let value = userDefaults.objectForKey(key) 
    print(value)

请注意,userDefaults.boolForKeyuserDefaults.floatForKey 都返回非可选值,因此它们永远不会是 nil(只有 false0.0)。

进一步阅读

NSUserDefaults — A Swift Introduction

【讨论】:

已重命名为UserDefaults.standard @Hykilpikonna,谢谢。随意编辑答案的内容。自从我最近专注于 Flutter 以来,我没有积极更新我的 Swift 答案。【参考方案4】:

您正在寻找NSUserDefaults

【讨论】:

【参考方案5】:

Swift 4 / Linux

显然有些事情发生了变化。现在有了UserDefault 类。 检查这些链接:

https://developer.apple.com/documentation/foundation/userdefaults

https://www.hackingwithswift.com/read/12/2/reading-and-writing-basics-userdefaults

【讨论】:

以上是关于如何保存我的 iPhone 应用程序的用户首选项?的主要内容,如果未能解决你的问题,请参考以下文章

保存/加载用户首选项配置文件

在 iPhone 上搜索应用程序的 info.plist 首选项

如何使用共享首选项让用户保持登录状态?

将自定义可序列化对象绑定到控件,以便用户和加载/保存首选项

保存文本大小首选项

如何在更新 iphone 应用程序时从库目录中保留用户数据?