2012-02-28 34 views
2

这是我的问题:我将plist加载到NSArray中。我没有在我的应用程序的任何地方声明任何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 2012-02-28 23:32:34

+2

你如何储存plist,你如何加载它? – Felix 2012-02-28 23:33:22

+0

我在编辑中添加了我的plist加载方法。 @Zaph我声明了一个NSArray,而不是一个NSDictionary。我知道一个NSDictionary也可以是一个NSArray,但我不明白为什么,如果是这种情况,我不能使用objectAtIndex访问我的NSArray的内容。 – Mokgra 2012-02-29 00:45:12

回答

0

你写:

我的plist就是关键:Item0字符串 “嗒嗒”

这是一本字典。 NSDictionary和字典一般没有订单,它们通过关键值访问。

NSArray不能是NSDictionary,反之亦然,它们是不同的类型。这不是你的“plist加载方法”,而是它自己的plistplist的创建方式。

plist的顶部元素可以是数组或字典,它决定了它在加载时是NSDictionary还是NSArray

查看Xcode中的plist或文本编辑器将帮助您了解正在发生的事情。使用NSLog()查看加载的plist,这也将提供洞察plist的实际结构。

你可能会发现,有一个顶级字典有你正在寻找的字典项目的数组。或者你想要的数据确实是一本字典,你需要使用NSDictionary=方法来访问你需要的项目。

0

线:

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

不“您的plist加载到数组”,它负载无论对象是在你的plist和到该基准分配给NSArray *类型的指针。

在Objective-C对象中是无类型的。程序员为了便于阅读而使用类型化的指针,以便编译器可以提供适当的警告。

尽管如此,id类型是可用的,它表示一个无类型的对象。任何类型都可以分配给idid对象可以分配给任何其他类型。在这些情况下,编译器无法检查你在做什么静态,所以你需要使用自己的判断。

在这种情况下,你的plist清楚地包含一个字典。所以NSPropertyListSerialization加载并返回一个字典,因为它可能返回任何属性类型,类型为id。简单地将它存储为NSArray *不会影响其在内存中的类型。

也许你想拿字典和allKeysallValues来获得一个数组代表字典中的元素的方式或其他。

0

检查你的plist?确保它实际上不是一个NSDictionary。