在iphone应用程序的Objective C中将字典中的数据加载到数组中
我有一个UINavigationController,它由一个表视图组成,我想将一些数据加载到其中。 我有一个字典plist,其中包含每条列车线的字典,而每条列车线又有每个车站的字典,带有相关信息和一个字符串lineName。我需要收集station Names键,并将它们添加到数组中,以填充我的表。这正在工作 行名作为字符串存储在我的lines字典中,键为lineName在iphone应用程序的Objective C中将字典中的数据加载到数组中,iphone,objective-c,uinavigationcontroller,nsarray,nsdictionary,Iphone,Objective C,Uinavigationcontroller,Nsarray,Nsdictionary,我有一个UINavigationController,它由一个表视图组成,我想将一些数据加载到其中。 我有一个字典plist,其中包含每条列车线的字典,而每条列车线又有每个车站的字典,带有相关信息和一个字符串lineName。我需要收集station Names键,并将它们添加到数组中,以填充我的表。这正在工作 行名作为字符串存储在我的lines字典中,键为lineName Root->| | |->TrainLine1(Dictionary)->|
Root->|
|
|->TrainLine1(Dictionary)->|
| |-> lineName (String)
| |-> Station1 (Dictionary)
| |-> Station2 (Dictionary)
|
|
|->TrainLine2(Dictionary)->|
| |-> lineName (String)
| |-> Station1 (Dictionary)
| |-> Station2 (Dictionary)
我走错方向了吗?我应该重组我的政策吗?
下面的代码使应用程序崩溃
- (void)viewDidLoad {
NSString *path = [[NSBundle mainBundle] pathForResource:@"lineDetails" ofType:@"plist"];
NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:path];
NSDictionary *lineDictionary = [[NSDictionary alloc] initWithDictionary:[dictionary objectForKey:stationNameKey]];
NSMutableArray *stationsOnLine = [[NSArray alloc] init];
NSString *key;
for (key in lineDictionary) {
NSLog(@"Adding this in array:%@", key);
//NSString *key2;
NSString *nameToTry = [NSString stringWithString:key];
NSLog(@"nameToTry : %@", nameToTry);
//NSMutableDictionary *stationDictionary = [[NSDictionary alloc] init];
if (![key isEqualToString: @"lineName"])
{
//NSMutableDictionary *stationDictionary = [[NSDictionary alloc] init];
// NSLog(@"Yes");
//NSMutableDictionary *tempDict = [[NSDictionary alloc] initWithDictionary:[lineDictionary objectForKey:key]];
NSMutableDictionary *stationDictionary = [[NSDictionary alloc] initWithDictionary:[lineDictionary objectForKey:key]];
//stationDictionary = tempDict;
NSLog(@"Object for key-- %@",[stationDictionary objectForKey:kStationName]);
[stationsOnLine addObject:[stationDictionary objectForKey:kStationName]];
[stationDictionary release];
//[tempDict release];
}
/*
for (key2 in stationDictionary)
{
NSLog(@"Adding this in station array:%@", key);
}
*/
}
stationNames = stationsOnLine;
//[stationDictionary release];
[stationsOnLine release];
[lineDictionary release];
[dictionary release];
}
调试器控制台输出:
2010-03-31 00:42:39.842 AMT_Schedule[8395:207] did SelectRow Array contents:deux-montagnes
2010-03-31 00:42:39.844 AMT_Schedule[8395:207] Adding this in array:sunnybrooke
2010-03-31 00:42:39.844 AMT_Schedule[8395:207] nameToTry : sunnybrooke
2010-03-31 00:42:39.845 AMT_Schedule[8395:207] Object for key-- Sunnybrooke
2010-03-31 00:42:39.846 AMT_Schedule[8395:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '*** -[NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'
2010-03-31 00:42:39.847 AMT_Schedule[8395:207] Stack: (
29320283,
2521638153,
29404219,
29404058,
107345,
107124,
17393,
3270466,
3263806,
3306080,
3302106,
3308563,
3289798,
3310951,
3289447,
15819,
3066438,
3049604,
303530,
29104832,
29101128,
37410325,
37410522,
2793391,
8628,
8482
)
在我看来,您的代码都很好。在for语句之外声明的键变量有点不寻常,但我认为它不会爆炸。你不会说你看到了什么样的崩溃,但我能想到的代码崩溃的唯一原因是如果其中一个方法在某个地方返回nil,然后nil作为一个参数传递给一个不接受它的方法。可能您没有从NSBundle中获得有效的路径,可能NSDictionary没有从该路径正确创建,诸如此类。您的代码在我看来都很好。在for语句之外声明的键变量有点不寻常,但我不认为它会爆炸。你不会说你看到了什么样的崩溃,但我能想到的代码崩溃的唯一原因是如果其中一个方法在某个地方返回nil,然后nil作为一个参数传递给一个不接受它的方法。可能您没有从NSBundle获得有效的路径,可能NSDictionary没有从该路径正确创建,诸如此类
NSMutableArray *stationsOnLine = [[NSArray alloc] init];
应该是
NSMutableArray *stationsOnLine = [[NSMutableArray alloc] init];
它编译得很好,因为Obj-C编译器认为这是一个NSMutableArray,但指针实际上指向一个NSArray实例,所以在运行时,这就是发送给immutable type error的mutating方法的全部内容。通常这会显示为一个无法识别的选择器错误,但我认为数组的内部处理方式会导致另一个更神秘的错误消息
应该是
NSMutableArray *stationsOnLine = [[NSMutableArray alloc] init];
它编译得很好,因为Obj-C编译器认为这是一个NSMutableArray,但指针实际上指向一个NSArray实例,所以在运行时,这就是发送给immutable type error的mutating方法的全部内容。正常情况下,这将显示为无法识别的选择器错误,但我认为内部处理数组的方式会导致另一个更为隐晦的错误消息。NSDictionary正在从捆绑包中创建,TrainLineKey正在存储,我可以将它们用作下一个视图的标题。我将复制日志文件和错误。我用正在运行和崩溃的实际代码修改了原始代码,以防万一。并添加了日志文件。NSDictionary正在从捆绑包中创建,TrainLineKey正在存储,我可以将它们用作下一个视图的标题。我将复制日志文件和错误。我用正在运行和崩溃的实际代码修改了原始代码,以防万一。并添加了日志文件。