1

「Supporting Files」フォルダーに PropertyList.plist ファイルがあります。その中で辞書を作りました。plist ファイルは次のとおりです。

ここに画像の説明を入力

私のViewController.mファイルコードは

   @implementation GroupedInexedViewController
{
    NSDictionary *names;
    NSArray *keys;
}
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"PropertyList"
                                                     ofType:@"plist"];
    NSDictionary *dict = [[NSDictionary alloc]
                          initWithContentsOfFile:path];
    names = dict;
    [dict release];
    NSArray *array = [[names allKeys] sortedArrayUsingSelector:
                      @selector(compare:)];
    keys = array;
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [keys count];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSString *key = [keys objectAtIndex:section];
    NSArray *nameSection = [names objectForKey:key];
    return [nameSection count];
}

-(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;
}

-(NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    NSString *key = [keys objectAtIndex:section];
    return key;
}

残念ながら、「keys」配列には要素が含まれていません。「keys.count」であるカウント値でアラートを作成し、それがゼロだったためです。また、「名前」の数もゼロでした。vieDidLoad メソッドのパス変数は正しいパスを示します。しかし、plistファイルの辞書から読み取ることはできません。

編集:nslogを使用しましたが、「viewDidLoad」メソッドで「names」がディクショナリをロードできることを示しています。しかし、「キー」配列はそれをロードできません。

4

2 に答える 2

2

@EugeneKが言ったことは機能しましたが、行の「cellForRowAtIndexPath」メソッドでsigabrtを取得しました

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

エラーメッセージは

「キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '-[__NSCFDictionary objectAtIndex:]: 認識されないセレクターがインスタンス 0x6832440 に送信されました」.

問題は、nameSection 変数が objectAtIndex メソッドをサポートしない NSDictionary 型オブジェクトとして表示されていたことです。

だから私が知っていたことは、それを行うのにあまり良い方法ではありません。他の方法があると確信しています。「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:52:44.247 に答える
1

マーティンRは正しいです。コード内のコメントを参照してください。

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"PropertyList"
                                                     ofType:@"plist"];
    NSDictionary *dict = [[NSDictionary alloc]
                          initWithContentsOfFile:path]; //retainCount of dict is 1
    names = dict; // you made weak reference to dict
    [dict release]; // retainCount is 0 - dict is being dealloced
    NSArray *array = [[names allKeys] sortedArrayUsingSelector:
                      @selector(compare:)]; // you try to get data from dealloced object
    keys = array;
}

次のことを試してください。

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

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

namesそしてkeys、あなたのビューコントローラでリリースすることを忘れないでくださいdealloc

于 2012-11-13T15:32:48.193 に答える