2012-02-28 6 views
2

私の問題は次のとおりです。NSArrayにplistをロードします。私はどこにNSDictionary私のアプリで宣言していないよ。pListからNSArrayをロードすると、NSDictionaryに配列が変換されるのはなぜですか?

今私はUIPickerViewを持っています。私はそれが私のビューコントローラのプライベートメンバとして座って言ったNSArrayから人口が必要です。私のピッカーは、 "titleForRow"メソッドを実装する必要があります。私はこのようにそれを実装する場合には、クラッシュ:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 
return [airportList objectAtIndex:row];  
} 

をしかし、私はそれが動作します。このようにそれを実装する場合:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 
NSDictionary *stupid = (NSDictionary *)airportList; 
NSString *airPortName = [stupid objectForKey:[NSString stringWithFormat:@"Item%d",row]]; 
NSLog(@"%@",airPortName); 
return airPortName; 
} 

はなぜにNSArrayは自動的にNSDictionaryのに変換されますか?

編集*: は、ここで私はplistのから私にNSArrayを生成する方法は次のとおりです。

-(NSArray *)createAirportList 
{ 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"AirportList" ofType:@"plist"]; 
    NSData *plistAirportNames = [NSData dataWithContentsOfFile:path]; 
    NSString *error; 
    NSPropertyListFormat format;  
    NSArray *airportNames = [NSPropertyListSerialization propertyListFromData:plistAirportNames mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error]; 
    if(!airportNames) 
    { 
     NSLog(@"Could not read the airport name. Error:%@",error); 
    } 
    return airportNames; 
} 

私のplistは単なるキーです:ITEM0列 "何とか"。だからちょっと辞書のようなええ、私は作成したNSArrayオブジェクトを使用することはできません?オートキャストとは何ですか?

+1

airportListを作成するコードを表示できますか? – jonkroll

+2

どのようにplistを保管し、どのようにロードしますか? – Felix

+0

上記の私のplistローディング方法を編集に追加しました。 @ Zaph NSDictionaryではなくNSArrayを宣言しています。私はNSDictionary NSArrayもすることができますが理解していますが、私は理解していない場合、その場合は、NSArrayのobjectAtIndexを使用してアクセスできません。 – Mokgra

答えて

0

あなたが書く:

私のplistは単なるキーです:ITEM0列 "何とか" 辞書です

NSDictionaryと辞書は一般的に順序がありません。キー値でアクセスされます。

NSArrayは、異なるタイプであることはできません。それはあなたの "plistローディング方法"ではありませんが、plistが作成された方法はそれ自身でplistです。

plistの先頭の要素は、配列または辞書のいずれかであり、ロード時にNSDictionaryまたはNSArrayであると判断されます。

Xcodeまたはテキストエディターでplistを見ると、何が起きているのかを理解するのに役立ちます。読み込まれたplistを表示するにはNSLog()を使用してください。plistの実際の構造についての洞察も得られます。

辞書の項目として探している配列を持つ最上位の辞書があります。または、必要なデータは実際に辞書であり、必要な項目にアクセスするにはNSDictionary=メソッドを使用する必要があります。

0

ライン:

NSArray *airportNames = [NSPropertyListSerialization 
          propertyListFromData:plistAirportNames 
          mutabilityOption:NSPropertyListImmutable 
          format:&format errorDescription:&error]; 

「がアレイにあなたのplistをロード」しない、それはあなたのplistにあるどのオブジェクトロード及びタイプNSArray *のポインタへの参照を割り当てます。

Objective-Cでは、オブジェクトは型指定されていません。プログラマは、可読性のために型付きポインタを使用し、コンパイラが適切な警告を提供できるようにします。

しかし、型なしのオブジェクトを表すidタイプも使用できます。任意のタイプをidに割り当て、idオブジェクトを他のタイプに割り当てることができます。そのような場合、コンパイラは静的に何をしているのかをチェックすることはできませんので、独自の判断を使用する必要があります。

この場合、plistには明らかに辞書が含まれています。そのため、NSPropertyListSerializationは辞書をロードして返します。タイプはidであるため、すべてのプロパティタイプが返される可能性があります。単にNSArray *として保存しても、そのメモリのタイプには影響しません。

おそらく辞書を使い、辞書の要素を表す配列を取得するには、allKeysまたはallValuesを呼び出します。

0

あなたのplistをチェックしますか?そこに実際にはNSDictionaryでないことを確認してください。

関連する問題