【问题标题】:Save string to the NSUserDefaults?将字符串保存到 NSUserDefaults?
【发布时间】:2011-03-05 16:57:51
【问题描述】:

如何将字符串保存到NSUserDefaults

【问题讨论】:

标签: ios swift objective-c cocoa-touch nsuserdefaults


【解决方案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 开始,不再需要调用 synchronizestackoverflow.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")
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2016-11-12
                            • 2012-06-13
                            • 2013-04-16
                            • 1970-01-01
                            相关资源
                            最近更新 更多