【问题标题】:How to save NSMutablearray in NSUserDefaults如何在 NSUserDefaults 中保存 NSMutablearray
【发布时间】:2013-11-07 04:53:00
【问题描述】:

我有两个NSMutableArray。它们由图像或文本组成。 数组通过UITableView 显示。 当我杀死应用程序时,UITableView 中的数据会丢失。 如何使用NSUserDefault将数组保存在UITableView中?

【问题讨论】:

    标签: ios objective-c uitableview nsmutablearray nsuserdefaults


    【解决方案1】:

    注意:NSUserDefaults 将始终返回您传入的对象的不可变版本。

    存储信息:

    // Get the standardUserDefaults object, store your UITableView data array against a key, synchronize the defaults
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:arrayOfImage forKey:@"tableViewDataImage"];
    [userDefaults setObject:arrayOfText forKey:@"tableViewDataText"];
    [userDefaults synchronize];
    

    要检索信息:

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSArray *arrayOfImages = [userDefaults objectForKey:@"tableViewDataImage"];
    NSArray *arrayOfText = [userDefaults objectForKey:@"tableViewDataText"];
    // Use 'yourArray' to repopulate your UITableView
    

    首次加载时,检查NSUserDefaults返回的结果是否为nil,如果是,则需要创建数据,否则从NSUserDefaults加载数据,UITableView将保持状态.

    更新

    在 Swift-3 中,可以使用以下方法:

    let userDefaults = UserDefaults.standard
    
    userDefaults.set(arrayOfImage, forKey:"tableViewDataImage")
    userDefaults.set(arrayOfText, forKey:"tableViewDataText")
    userDefaults.synchronize()
    
    var arrayOfImages = userDefaults.object(forKey: "tableViewDataImage")
    var arrayOfText = userDefaults.object(forKey: "tableViewDataText")
    

    【讨论】:

    • 您的问题询问如何在 NSUserDefaults 中存储数组。
    • “NSUserDefaults 将始终返回一个不可变的版本”是我的答案。非常感谢!
    • Swift 3 不需要执行synchronize
    【解决方案2】:

    你可以像这样保存你的可变数组:

    [[NSUserDefaults standardUserDefaults] setObject:yourArray forKey:@"YourKey"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    

    稍后您从用户默认值中获取可变数组。如果您想稍后编辑数组,获取可变副本很重要。

    NSMutableArray *yourArray = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"YourKey"] mutableCopy];
    

    然后,您只需通过 UITableView 委托从可变数组中设置 UITableview 数据

    希望这会有所帮助!

    【讨论】:

    【解决方案3】:

    我只想在其他答案中补充一点,您要存储在NSUserDefault 中的对象必须符合 Apple 文档中的报告:

    "value参数只能是属性列表对象:NSDataNSStringNSNumber、NSDate、NSArray或NSDictionary。对于NSArray和NSDictionary对象,它们的内容必须是属性列表对象。"

    这里是property list programming guide的链接

    所以要注意你的数组里面有什么

    【讨论】:

      【解决方案4】:

      保存:

      NSUserDefaults.standardUserDefaults().setObject(PickedArray, forKey: "myArray")
       NSUserDefaults.standardUserDefaults().synchronize()
      

      检索:

      if let PickedArray = NSUserDefaults.standardUserDefaults().stringForKey("myArray") {
          print("SUCCCESS:")
          println(PickedArray)
      }
      

      【讨论】:

        【解决方案5】:

        您真的要将图像存储在属性列表中吗?您可以将图像保存到文件中并将文件名存储为NSDictionary 中的值。

        定义存储文件的路径

        
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        self.basePath = [paths firstObject];
        

        存储和加载图像:

        
        - (NSString *)imageWithKey:(NSString)key {
            NSString *fileName = [NSString stringWithFormat:@"%@.png", key]
            return [self.basePath stringByAppendingPathComponent:fileName];
        }
        
        - (void)saveImage:(UIImage *)image withKey:(NSString)key {
            NSData *imageData = UIImagePNGRepresentation(image);
            [imageData writeToFile:[self imageWithKey:key] atomically:YES];
        }
        
        - (UIImage *)loadImageWithKey:(NSString)key { {
            return [UIImage imageWithContentsOfFile:[self imageWithKey:key]];
        }
        

        您可以将路径或索引存储在NSMutableDictionary

        
        - (void)saveDictionary:(NSDictionary *)dictionary {
            NSMutableDictionary *dictForSave = [@{ } mutableCopy];
            for (NSString *key in [dictionary allKeys]) {
                [self saveImageWithKey:key];
                dictForSave[key] = @{ @"image" : key };
            }
            [[NSUserDefaults standardUserDefaults] setObject:dictForSave forKey:@"MyDict"];
        }
        
        - (NSMutableDictionary *)loadDictionary:(NSDictionary *)dictionary {
            NSDictionary *loadedDict = [[NSUserDefaults standardUserDefaults] objectForKey:@"MyDict"];
            NSMutableDictionary *result = [@{ } mutableCopy];
            for (NSString *key in [loadedDict allKeys]) {
                result[key] = [self imageWithKey:key];
            }
            return result;
        }
        

        NSUserDefaults 中,您只能存储简单的对象,例如NSStringNSDictionaryNSNumberNSArray

        您还可以使用符合 NSCoding 协议的NSKeyedArchiver/NSKeyedUnarchiver 序列化对象。

        【讨论】:

          【解决方案6】:

          如果您需要以特定于 ant 的顺序将字符串添加到 NSMutableArray,或者如果您将 NSMutableArray 用于 UITableView,您可能希望使用它来代替:

          [NSMutableArray insertObject:string atIndex:0];
          

          【讨论】:

            【解决方案7】:

            在 Swift 3 中,对于 NSMutableArray,您需要对数组进行编码/解码,以便能够在 NSUserDefaults 中保存/检索它:

            保存

            //Encoding array
            let encodedArray : NSData = NSKeyedArchiver.archivedData(withRootObject: myMutableArray) as NSData
            
            //Saving
            let defaults = UserDefaults.standard
            defaults.setValue(encodedArray, forKey:"myKey")
            defaults.synchronize()
            

            检索

            //Getting user defaults
            let defaults = UserDefaults.standard
            
            //Checking if the data exists
            if defaults.data(forKey: "myKey") != nil {
               //Getting Encoded Array
               let encodedArray = defaults.data(forKey: "myKey")
            
               //Decoding the Array
               let decodedArray = NSKeyedUnarchiver.unarchiveObject(with: encodedArray!) as! [String]
            }
            

            删除

            //Getting user defaults
            let defaults = UserDefaults.standard
            
            //Checking if the data exists
            if defaults.data(forKey: "myKey") != nil {
            
                //Removing the Data
                defaults.removeObject(forKey: "myKey")
            
            }
            

            【讨论】:

              【解决方案8】:

              用key将Array的信息保存在NSUserdefaults中。

              “从 JSON 响应收到的 MutableArray”

              [[NSUserDefaults standardUserDefaults] setObject:statuses forKey:@"arrayListing"];
              

              “在项目中的任何地方使用相同的键检索此信息(数组)”

              NSArray *arrayList = [[NSUserDefaults standardUserDefaults] valueForKey:@"arrayListing"];
              

              这对我的项目有帮助,希望对某人有所帮助。

              【讨论】:

                【解决方案9】:

                Swift 版本:

                在 NSUserDefaults 中保存数组:

                NSUserDefaults.standardUserDefaults().setObject(selection, forKey: "genderFiltersSelection")
                

                从 NSUserDefaults 中检索 Bool 数组:

                if NSUserDefaults.standardUserDefaults().objectForKey("genderFiltersSelection") != nil{
                                selection = NSUserDefaults.standardUserDefaults().objectForKey("genderFiltersSelection") as? [Bool] ?? [Bool]()
                   }
                

                从 NSUserDefaults 中检索字符串数组:

                if NSUserDefaults.standardUserDefaults().objectForKey("genderFiltersSelection") != nil{
                                selection = NSUserDefaults.standardUserDefaults().objectForKey("genderFiltersSelection") as? [String] ?? [String]()
                    }
                

                【讨论】:

                  猜你喜欢
                  • 2013-04-16
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-07-17
                  • 1970-01-01
                  相关资源
                  最近更新 更多