0

嗨,当我使用 objectAtInded 方法从数组中检索 NSString 时,我似乎总是遇到异常。我正在从“PropertyList.plist”文件中的字典中读取数据。我的代码是

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"PropertyList"
                                                     ofType:@"plist"];
    names = [[NSDictionary alloc]
             initWithContentsOfFile:path];

    keys = [[[names allKeys] sortedArrayUsingSelector:
             @selector(compare:)] retain];
}


-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger section = [indexPath section];
    NSUInteger row = [indexPath row];

    NSString *key  = [keys objectAtIndex:section];
    NSArray *nameSection = [names objectForKey:key];
    static NSString *SectionsTableIdentifier = @"SectionsTableIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SectionsTableIdentifier];
    if(cell == nil)
    {
        cell = [[[UITableViewCell alloc]
                 initWithStyle:UITableViewCellStyleDefault reuseIdentifier:SectionsTableIdentifier] autorelease];
    }
    cell.textLabel.text = [nameSection objectAtIndex:row];
    return cell;
}

异常发生在该行中的方法“cellForRowAtIndexPath”上

cell.textLabel.text = [nameSection objectAtIndex:row];

错误信息是

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFDictionary objectAtIndex:]:无法识别的选择器发送到实例 0x6832440

plist文件是 在此处输入图像描述

我在哪里使用“[nameSection objectAtIndex:row];” 语句类型它总是得到异常。

4

3 回答 3

2

其原因可能如下

  1. [名称 objectForKey:key];。该语句可以为输出提供 NSMutableDictionary 类型,并且您从中获取 NSArray。或者

  2. 如果它是一个数组,那么使用下面的代码来获取 nameSection

       NSMutableArray *nameSection = (NSMutableArray*)[names objectForKey:key];
       // using (NSMutableArray*) before the code is for external typecasting to tell the compiler that the output is of NSMutableArray type.
    

希望这可以帮助。

编辑:-

使用以下方法从 plist 文件中获取您的字典

        -(NSMutableDictionary *) GetDictDataFromPlistFile:(NSString *) fileName
       {
             NSError *error;
             NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); //1
             NSString *documentsDirectory = [paths objectAtIndex:0]; //2
             NSString *path = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.plist",fileName]]; //3

              NSFileManager *fileManager = [NSFileManager defaultManager];

            if (![fileManager fileExistsAtPath: path]) //4
            {
                   NSString *bundle = [[NSBundle mainBundle] pathForResource:fileName ofType:@"plist"]; //5
                  [fileManager copyItemAtPath:bundle toPath: path error:&error]; //6
             }

              NSMutableDictionary *dictData =   [[NSMutableDictionary alloc] initWithContentsOfFile:path];

               return dictData;
        }
于 2012-11-14T04:57:22.620 回答
1

在这里,name只包含 的一个键root。您需要的name是 key 的值Root。请重试!

于 2012-11-14T05:26:20.630 回答
0

就像@scorpiozj 说的'names' 只包含'Root' 的键。所以我所做的我知道这不是一个很好的方法。我确信还有其他方法。我将“viewDidLoad”方法更改为此,

 - (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"PropertyList"
                                                     ofType:@"plist"];
    names = [[NSDictionary alloc]
             initWithContentsOfFile:path];
    keys = [names allKeys];
    NSString *key = [keys objectAtIndex:0];
    names = [names objectForKey:key];
    keys = [[[names allKeys] sortedArrayUsingSelector:@selector(compare:)] retain];
    NSLog(@"keys = %@  names = %@",keys,names);
}

有用!不过,任何如何做得更好的想法都将不胜感激。

于 2012-11-14T06:16:38.280 回答