1

MutableArrayを使用して「オブジェクトでいっぱいの」を別のクラスに渡すにはどうすればよいNSUserDefaultsですか?「」を渡す方法は知っていますMutableArrayが、これは機能しません。

それで;

私はMutableArrayを持っています。' myCityObjects'、そして私はそれにオブジェクトを投入します; ' cities'各' cities'オブジェクトにはcityNamecityLocationなどのプロパティがあります。

[myCityObjects addObject:cities];

さて、私がやりたいのは、 ' 'MutableArrayを使用して、これ(オブジェクトで埋められた)を別のクラスに渡すことです。NSUserDefaults

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

そして他のクラスでは、

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

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

しかし、それは機能しません!私はmyCityObjects他のクラスに入ることができません、" getMyCityObjects"は空です。どうすれば修正できますか?

ありがとう、E。

4

4 に答える 4

3

NSUserDefaultsは、元のオブジェクトが変更可能であったとしても、常に不変のオブジェクトを返します。

最初のビューでは、次のようにNSUserDefaultsに値を保存できます。

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

この後、別のビューで、この方法でNSUserDefaultsから値を取得できます。

NSMutableArray *abc = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"MCO"]];
于 2013-01-29T05:26:20.430 に答える
2

配列内のオブジェクト(カスタムオブジェクト)をシリアル化できないため、配列はnilです。

NSCodingプロトコルをご覧ください。シリアル化するオブジェクト(NSUserDefaultsへの書き込みなど)は、メソッド-encodeWithCoder:とを実装する必要があり-initWithCoderます。

私があなたに与えた用語を検索することで、これがいかに簡単に行われるかがわかると思います...

于 2013-01-29T05:51:27.627 に答える
1

私は以前にこの問題に遭遇しました。NSUserDefaultsの問題は、文字列、数値、ブール値、およびこれらのタイプの値の配列またはディクショナリのみを含めることができることです。私の解決策は、すべてのプロパティをNSDictionariesに保存することでそれを回避することです。

「cities」クラス(私はCityClassと呼んでいます)に2つのクラス関数を作成します。

+(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];
于 2013-01-29T05:40:52.907 に答える
0

ここでできることは、他のクラスにコンストラクターを作成することです。

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

}

最初のクラスから、この配列を次のように送信します。

[objOfSecondClass initWithArrayOfObject: myCityObjects];
于 2013-01-29T05:13:53.080 に答える