这是我的问题:我将plist加载到NSArray中。我没有在应用程序的任何地方声明任何NSDictionary。
现在,我有一个UIPickerView。我希望从表示为我的视图控制器的 private 成员的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;
}
我的列表只是键:Item0字符串“blah”。所以是的,有点像字典,但是为什么我不能使用我创建的NSArray对象呢?自动类型转换是什么?
最佳答案
你写:
我的列表只是键:Item0字符串“blah”
那是字典。 NSDictionary
和字典通常没有顺序,它们通过键值进行访问。NSArray
不能是NSDictionary
,反之亦然,因为它们是不同的类型。这不是您的“plist加载方法”,而是它自己的plist
,即plist
的创建方式。plist
的顶部元素可以是数组或字典,并且在加载时确定是NSDictionary
还是NSArray
。
在Xcode或文本编辑器中查看plist可以帮助您了解正在发生的事情。使用NSLog()
查看已加载的plist,这还将提供对plist
实际结构的深入了解。
您可能会发现,有一个顶级词典,其中包含您要查找的数组作为词典项。或者,您想要的数据确实是一个字典,您将需要使用NSDictionary=
方法来访问所需的项目。
关于ios - 为什么从pList加载NSArray会使我的数组变成NSDictionary?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9491346/