将字符串保存到 NSUserDefaults?
Posted
技术标签:
【中文标题】将字符串保存到 NSUserDefaults?【英文标题】:Save string to the NSUserDefaults? 【发布时间】:2011-03-05 16:57:51 【问题描述】:如何将字符串保存到NSUserDefaults
?
【问题讨论】:
试试这个:jayprakashdubey.blogspot.in/2014/07/nsuserdefault-usage.html 如果您正在寻找 Swift,那么我已经添加了答案。 【参考方案1】:NSString *valueToSave = @"someValue";
[[NSUserDefaults standardUserDefaults] setObject:valueToSave forKey:@"preferenceName"];
[[NSUserDefaults standardUserDefaults] synchronize];
稍后取回
NSString *savedValue = [[NSUserDefaults standardUserDefaults]
stringForKey:@"preferenceName"];
【讨论】:
有没有办法根据特定日期保存这个字符串?谢谢,但你的代码和我的一样,我创建了一个自定义日历应用程序,用户可以在其中写笔记,例如在 2 月 3 日,用户写了一些东西,这个文本应该在 2 月 3 日保存,当用户移动到另一个天他/她可以写其他东西累积到当天日期 由于某种原因,在我调用同步方法之前,保存部分无法正常工作。NSString *valueToSave = @"someValue";[[NSUserDefaults standardUserDefaults]setObject:valueToSave forKey:@"preferenceName"]; [[NSUserDefaults standardUserDefaults]synchronize
[[NSUserDefaults standardUserDefaults] 同步];正在被弃用
从 ios 12 开始,不再需要调用 synchronize
:***.com/a/57218546/12484【参考方案2】:
[[NSUserDefaults standardUserDefaults] setValue:aString forKey:aKey]
【讨论】:
【参考方案3】:更准确地说
-(void)saveToUserDefaults:(NSString*)myString
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
if (standardUserDefaults)
[standardUserDefaults setObject:myString forKey:@"timestamps"];
[standardUserDefaults synchronize];
【讨论】:
standardUserDefaults
对象不需要执行 nil 检查。在 Objective-C 中向 nil 发送消息是非常好的。
但更重要的是他包含了“同步”——如果你不调用它,NSUserDefaults 就会非常不稳定!
standardUserDefaults 同步为我修复了一些奇怪的错误,谢谢!
参考文献谈到synchronize
方法:“只有当你不能等待自动同步时才使用这个方法(例如,如果你的应用程序即将退出)”-NSUserDefaults Class Reference跨度>
@jbrennan 虽然您的评论在技术上是正确的,但如果您正在编写重要的内容并希望确保它已成功保存,则此答案很有帮助。此外,在这方面,最好测试(而不是忽略)synchronize
的返回值。文档说:如果数据成功保存到磁盘,则为 YES,否则为 NO。【参考方案4】:
类似这样的:
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
// saving an NSString
[prefs setObject:@"TextToSave" forKey:@"keyToLookupString"];
然后去检索:
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
// getting an NSString
NSString *myString = [prefs stringForKey:@"keyToLookupString"];
您真的应该查看 Apple 的 NSUserDefaults 类参考,也可以查看本教程:iPhone Programming Tutorial – Saving/Retrieving Data Using NSUserDefaults
【讨论】:
【参考方案5】:不要忘记这句话,否则它可能并不总是有效:
[standardUserDefaults synchronize];
【讨论】:
【参考方案6】:一个好的做法是使用一个常量作为键来避免你不使用相同的键存储和读取的错误
NSString* const TIME_STAMPS_KEY = @"TIME_STAMPS_KEY";
【讨论】:
【参考方案7】:NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
// saving an NSString
[prefs setObject:@"TextToSave" forKey:@"keyToLookupString"];
// saving an NSInteger
[prefs setInteger:42 forKey:@"integerKey"];
// saving a Double
[prefs setDouble:3.1415 forKey:@"doubleKey"];
// saving a Float
[prefs setFloat:1.2345678 forKey:@"floatKey"];
// This is suggested to synch prefs, but is not needed (I didn't put it in my tut)
[prefs synchronize];
检索
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
// getting an NSString
NSString *myString = [prefs stringForKey:@"keyToLookupString"];
// getting an NSInteger
NSInteger myInt = [prefs integerForKey:@"integerKey"];
// getting an Float
float myFloat = [prefs floatForKey:@"floatKey"];
【讨论】:
【参考方案8】:以下是使用 Swift 执行相同操作的方法;
var valueToSave = "someValue"
NSUserDefaults.standardUserDefaults().setObject(valueToSave, forKey: "preferenceName")
稍后取回;
if let savedValue = NSUserDefaults.standardUserDefaults().stringForKey("preferenceName")
// Do something with savedValue
在 Swift 3.0 中
var valueToSave = "someValue"
UserDefaults.standard.set(valueToSave, forKey: "preferenceName")
if let savedValue = UserDefaults.standard.string(forKey: "preferenceName")
【讨论】:
谢谢,因为最初的问题是 swift,+1 午饭后我的愤世嫉俗检测器出现问题。最初的问题是在 2010 年提出的。因此,我对此表示赞成,因为 Swift 是今天要走的路。【参考方案9】:-(void)saveToUserDefaults:(NSString*)string_to_store keys:(NSString *)key_for_the_String
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
if (standardUserDefaults)
[standardUserDefaults setObject:string_to_store forKey:key_for_the_String];
[standardUserDefaults synchronize];
并通过以下方式调用它:
[self saveToUserDefaults:@"string_to_store" : @"key_for_the_string"];
使用以下方法检索字符串:
NSString * stored_string = [[NSUserDefaults standardUserDefaults] stringforkey:key_for_the_String]
【讨论】:
【参考方案10】:为了节省使用这个:
[[NSUserDefaults standardUserDefaults]setObject:@"YES" forKey:@"KTerminated"];
[[NSUserDefaults standardUserDefaults]synchronize];
为了检索使用这个:
[[[NSUserDefaults standardUserDefaults]stringForKey:@"KTerminated"] isEqualToString:@"YES"];
【讨论】:
【参考方案11】:在这里,对于 Swift,我创建了两个函数,分别调用 Preference 中键的保存和检索值
也许这对你很有帮助
// 用于保存对象
static func setObject(value:AnyObject ,key:String)
let pref = NSUserDefaults.standardUserDefaults()
pref.setObject(value, forKey: key)
pref.synchronize()
static func getObject(key:String) -> AnyObject
let pref = NSUserDefaults.standardUserDefaults()
return pref.objectForKey(key)!
【讨论】:
【参考方案12】:第一视图
NSMutableArray *array;
- (void)viewDidLoad
[super viewDidLoad];
array = [[NSMutableArray alloc]init];
array = [[NSUserDefaults standardUserDefaults]objectForKey:@"userlist"];
NSLog(@"%lu",(unsigned long)array.count);
if (array>0)
for (int i=0; i<array.count; i++)
NSDictionary *dict1 = @@"Username":[[array valueForKey:@"Username"] objectAtIndex:i],@"Mobilenumber":[[array valueForKey:@"Mobilenumber"] objectAtIndex:i],@"Firstname":[[array valueForKey:@"Firstname"] objectAtIndex:i],@"Lastname":[[array valueForKey:@"Lastname"] objectAtIndex:i],@"dob":[[array valueForKey:@"dob"] objectAtIndex:i],@"image":[[array valueForKey:@"image"] objectAtIndex:i];
NSLog(@"%@",dict1);
NSArray *array1 = [[NSArray alloc]initWithObjects:dict1, nil];
[[NSUserDefaults standardUserDefaults] setObject:array1 forKey:@"UserList"];
图像选择器
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
self.imaGe.image = chosenImage;
[picker dismissViewControllerAnimated:YES completion:NULL];
(IBAction)submitBton:(id)sender
NSMutableArray *array2 = [[NSMutableArray alloc]initWithArray:
[[NSUserDefaults standardUserDefaults]objectForKey:
@"userlist"]];
UIImage *ima = _imaGe.image;
NSData *imagedata = UIImageJPEGRepresentation(ima,100);
NSDictionary *dict = @@"Username":_userTxt.text,@"Lastname":_lastTxt.text,@"Firstname":_firstTxt.text,@"Mobilenumber":_mobTxt.text,@"dob":_dobTxt.text,@"image":imagedata;
[array2 addObject:dict];
[[NSUserDefaults standardUserDefaults]setObject:array2
forKey:@"userlist"];
NSLog(@"%@",array2);
[self performSegueWithIdentifier:@"second" sender:self];
(IBAction)chooseImg:(id)sender
UIImagePickerController *picker = [[UIImagePickerController 分配]初始化]; 选择器.delegate = self; 选择器.allowsEditing = YES; 选择器.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; [self presentViewController:picker animated:YES completion:NULL];
第二次查看 NSMutableArray *arr;
- (void)viewDidLoad
[super viewDidLoad];
arr =[[NSMutableArray alloc]init];
arr = [[NSUserDefaults standardUserDefaults]objectForKey:@"userlist"];
#pragma mark- TableView DataSource
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return 1;
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return arr.count;
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *cellId = @"tablecell";
TableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:cellId];
cell.userLbl.text =[[arr valueForKey:@"username"] objectAtIndex:indexPath.row];
cell.ageLbl.text =[[arr valueForKey:@"dob"] objectAtIndex:indexPath.row];
cell.profileImg.image =[UIImage imageNamed:[[arr valueForKey:@"image"] objectAtIndex:indexPath.row]];
return cell;
【讨论】:
【参考方案13】:Swift 3 更新
func setObject(value:AnyObject ,key:String)
let pref = UserDefaults.standard
pref.set(value, forKey: key)
pref.synchronize()
func getObject(key:String) -> AnyObject
let pref = UserDefaults.standard
return pref.object(forKey: key)! as AnyObject
【讨论】:
【参考方案14】:在 Swift 4.0.3 Xcode 9 中
============set Data in UserDefaults =========
UserDefaults.standard.set(userName, forKey: "userName")
UserDefaults.standard.synchronize()
============Get Data in UserDefaults =========
let userName = UserDefaults.standard.string(forKey: "userName")
print(userName ?? "Gera")
userNameTextField.text = ""+userName!
【讨论】:
【参考方案15】:在 Swift5 和 Xcode 10.2
//Save
UserDefaults.standard.set(true, forKey: "Key1") //Bool
UserDefaults.standard.set(1, forKey: "Key2") //Integer
UserDefaults.standard.set("This is my string", forKey: "Key3") //String
UserDefaults.standard.synchronize()
//Retrive
UserDefaults.standard.bool(forKey: "Key1")
UserDefaults.standard.integer(forKey: "Key2")
UserDefaults.standard.string(forKey: "Key3")
//Remove
UserDefaults.standard.removeObject(forKey: "Key3")
注意: 将文本数据(指字符串、数组、字典等)保存在 UserDefaults 中。请勿将图片保存在 UserDefaults 中,不推荐(将图片保存在本地目录中)。
【讨论】:
【参考方案16】:这里 Swift 更新了:
let userID = "BOB"
声明用户默认值:
let defaults = UserDefaults.standard
defaults.setValue(userID, forKey: "userID")
得到它:
let userID = defaults.object(forKey: "userID")
【讨论】:
以上是关于将字符串保存到 NSUserDefaults?的主要内容,如果未能解决你的问题,请参考以下文章
即使应用程序将被删除,如何在 NSUserDefaults 中保存数据?
将UIColor保存到NSUserDefaults并从NSUserDefaults加载