0

キーと値を含むplistがあります...言ってみましょう:

key: alpha_male_body_language
value: Alpha Male Body Language
key: building_attraction
value: Building Attraction
key: fifteen_lessons
value: Fifteen Lessons
key: how_can_it_have_gone_wrong
value: How can It Have Gone Wrong

テーブルビューの私の実装は次のとおりです。

#import "BookTitleViewController.h"
#import "BookLessonViewController.h"

@interface BookTitleViewController ()

@end

@implementation BookTitleViewController{
    NSDictionary *bookTitles;
}

@synthesize tableView;
@synthesize bookTitles;

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.bookTitles = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"book" ofType:@"plist"]];

}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.

    self.bookTitles = nil;
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.bookTitles count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"RecipeCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }

    NSString *value = [[self.bookTitles allValues] objectAtIndex:indexPath.row];

    //cell.textLabel.text = [recipes objectAtIndex:indexPath.row];
    cell.textLabel.text = value;

    return cell;
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"ShowBookLesson"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        BookLessonViewController *destViewController = segue.destinationViewController;

        destViewController.bookTitleKey = [[self.bookTitles allKeys] objectAtIndex:indexPath.row];
        destViewController.bookTitleValue = [[self.bookTitles allValues] objectAtIndex:indexPath.row];

        //destViewController.recipeName = [recipes objectAtIndex:indexPath.row];
    }
}

@end

上記のコードを使用すると、次の 2 つの問題があります。

  1. リストは、plist から読み取った後に順番に表示されません。たとえば、タイトル「どうしたらうまくいかないのか」は、4 番目にリストされていることを知って、1 番目のリストに表示されます。

  2. 次のような例外が発生します。

    -[UINavigationController setBookTitleValue:]: 認識されないセレクターがインスタンス 0x894c230 に送信されました

これは次の行を指しています:

 destViewController.bookTitleKey = [[self.bookTitles allKeys]     objectAtIndex:indexPath.row];
 destViewController.bookTitleValue = [[self.bookTitles allValues] objectAtIndex:indexPath.row];

(prepareForSegue 関数内)。

この問題を解決するのを手伝ってください。ありがとうございます!

4

2 に答える 2

2

plist が辞書の生成に使用されているようです。NSDictionary のキー (したがって値) は順序付けされていません。したがって、キーを取り出す順序は固定されていません。

したがって、キーと値が特定の位置にあると想定している場合、それは間違った想定です。

ディクショナリではなく、データ ソースとして配列を使用する必要があります。

于 2013-07-07T14:49:28.403 に答える