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. [names 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

Here, name contains only one key of root. What you need for name is the value of key Root. Please retry!

于 2012-11-14T05:26:20.630 に答える
0

@scorpiozjが言ったように、「名前」には「ルート」のキーのみが含まれています。だから私が知っていたことは、それを行うのにあまり良い方法ではありません。他の方法があると確信しています。「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 に答える