这是我的问题:我将一个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字符串“blah”。所以,它有点像字典,但为什么我不能使用我创建的NSArray对象?什么是自动类型转换?
答案 0 :(得分: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
来获得一个数组,以一种方式表示字典中的元素。
答案 1 :(得分:0)
你写道:
我的plist只是键:Item0字符串“blah”
这是一本字典。 NSDictionary
和字典一般没有订单,可以通过键值访问它们。
NSArray
不能是NSDictionary
,反之亦然,它们是不同的类型。这不是你的“plist加载方法”,而是plist
它自己,就像创建plist
一样。
plist
的顶部元素可以是数组或字典,并且在加载时确定它是NSDictionary
还是NSArray
。
查看Xcode中的plist或文本编辑器将帮助您了解正在发生的事情。使用NSLog()
查看已加载的plist,还可以深入了解plist
的实际结构。
您可能会发现有一个顶级字典,其中包含您要查找的数组作为字典项。或者您想要的数据确实是字典,您需要使用NSDictionary=
方法来访问所需的项目。
答案 2 :(得分:0)
检查你的plist?确保它实际上不是NSDictionary。