这是我的问题:我将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/

10-11 22:17
查看更多