【问题标题】:How can I pass a "MutableArray with full of Objects" to another class by using NSUserDefaults?如何使用 NSUserDefaults 将“充满对象的 MutableArray”传递给另一个类?
【发布时间】:2013-01-29 05:03:01
【问题描述】:

如何使用NSUserDefaults 将“带有完整对象的MutableArray”传递给另一个类?我知道如何传递“MutableArray”,但这不起作用!

所以;

我有一个 MutableArray; 'myCityObjects',我用对象填充它; 'cities' 在每个'cities'对象中都有cityNamecityLocation等属性...

[myCityObjects addObject:cities];

现在,我要做的是使用 'NSUserDefaults' 将这个 MutableArray(充满对象)传递给另一个类;

[[NSUserDefaults standardUserDefaults] setObject: myCityObjects forKey:@"MCO"];

在另一个班级,

NSMutableArray *getMyCityObjects = [[NSArray alloc] init];

getMyCityObjects = [[NSUserDefaults standardUserDefaults] mutableArrayValueForKey:@"MCO"];

但它不起作用!我无法在其他班级获得myCityObjects,“getMyCityObjects”为空。我该如何解决?

谢谢, E.

【问题讨论】:

  • 您的问题解决了吗?只需查看我的答案。

标签: iphone objective-c xcode nsmutablearray nsuserdefaults


【解决方案1】:

NSUserDefaults 总是返回不可变对象,即使原始对象是可变的。

在您的第一个视图中,您可以像这样在 NSUserDefaults 中保存值:

NSMutableArray *arr= [NSMutableArray arrayWithObjects:@"asd",@"dsa",nil];
[[NSUserDefaults standardUserDefaults] setObject:arr forKey:@"MCO"];

在另一个视图中,您可以通过这种方式从 NSUserDefaults 中检索值。

NSMutableArray *abc = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"MCO"]];

【讨论】:

  • 您说得很好,但我认为他遇到的主要问题是 NSUserDefaults 只能存储数字、字符串和布尔值,以及这些值的数组和字典。它不能直接包含对象。
  • 但是一旦他/她拥有完整的数组,我们就可以将这个值存储在 NSUserDefaults 中。另一种方式是我们也可以在 NSDictionary 中存储值。
【解决方案2】:

您的数组为 nil,因为其中的对象(您的自定义对象)无法序列化。

请查看 NSCoding 协议。您想要序列化的对象(例如用于写入 NSUserDefaults)必须实现方法 -encodeWithCoder:-initWithCoder

我相信你会发现搜索我给你的术语很容易做到这一点......

【讨论】:

    【解决方案3】:

    我以前遇到过这个问题。 NSUserDefaults 的问题在于它只能包含字符串、数字和布尔值,以及这些类型值的数组或字典。我的解决方案是通过将所有属性存储在 NSDictionaries 中来解决这个问题。

    在“城市”类(我称之为 CityClass)上创建两个类函数:

    +(NSDictionary *)dictionaryFromCity:(CityClass *)myCity {
        NSDictionary *returnDict = @{@"keyForIntProperty" : myCity.intProperty, @"keyForFloatProperty" : myCity.floatProperty, @"keyForNSStringProperty", myCity.NSStringProperty"};
        return returnDict;
    }
    
    
    +(CityClass *)cityFromDictionary:(NSDictionary *)myDict {
        CityClass *returnCity = [[CityClass alloc] init];
        returnCity.intProperty = [[myDict objectForKey:@"keyForIntProperty"] intValue];
        returnCity.floatProperty = [[myDict objectForKey:@"keyForFloatProperty"] floatValue];
        returnCity.NSStringProperty = [myDict objectForKey:@"keyForNSStringProperty"];
        //any other setup for the CityClass
        return returnCity;
    }
    

    现在您可以使用新功能毫无问题地存储和检索您的对象:

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    
    //store a CityClass object
    NSDictionary *storageDict = [CityClass dictionaryFromCity:cityToStore];
    [defaults setObject:storageDict forKey:@"keyForCity"];
    
    //retrieve a CityClass object
    NSDictionary *retrieveDict = [defaults objectForKey:@"keyForCity"];
    CityClass *retrievedCity = [CityClass cityFromDictionary:retrieveDict];
    

    【讨论】:

      【解决方案4】:

      您可以在这里做的是在您的其他类中创建一个构造函数,例如

      -(void)initWithArrayOfObject:(NSMutableArray *)arr_OfObjects;
      {
          arr_SecondClassArrayOfObjects = [[NSMutableArray alloc]initWithArray:arr_OfObjects];
      
      }
      

      从你的第一堂课发送这个数组:

      [objOfSecondClass initWithArrayOfObject: myCityObjects];
      

      【讨论】:

      • 嗨 Rushi,“arr_SecondClassArrayOfObjects”已正确填充,但无法从中获取值。前任; -(void)initWithArrayOfObject:(NSMutableArray *)arr_OfObjects; { arr_SecondClassArrayOfObjects = [[NSMutableArray alloc]initWithArray:arr_OfObjects]; for (Cities *ct in arr_SecondClassArrayOfObjects) { self.myLabel1.text = ct.CityName; } } 所以; “self.myLabel1.text = ct.CityName;”是 甚至 "self.myLabel1.text = @"exampleCity";" 在构造函数内部但在外部(例如在 ViewDidLoad 内部)这是有效的。你认为问题是什么?谢谢,E。
      • @ervinaydin:在上面的示例中,将 for 循环更改为: for(int i = 0; i
      猜你喜欢
      • 2022-12-04
      • 2014-10-19
      • 2011-08-29
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      相关资源
      最近更新 更多