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

这是我的tableview实现:

#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

使用上面的代码我有两个问题:

  1. 从 plist 读取列表后,列表未按顺序显示。例如,标题“它怎么会出错”显示在第一个列表中,知道它在第 4 个列表中。

  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 回答
1

有关问题 2 可能解决方案的更多详细信息:

  1. 添加UIStoryboardSegue+MMNavigationController.h到您的项目,在这个 Github 存储库中找到
  2. 在视图控制器的实现文件中导入该头文件
  3. 在您的实现中更改一行,prepareForSegue:sender:如下所示:
BookLessonViewController *destViewController = segue.topLevelDestinationViewController;

说明:如果故事板 segue 指向的目标视图控制器包含在 a 中UINavigationController,那么 segue 的destinationViewControllerwill 值将是导航控制器对象。此处引用的代码将通过检查是否destinationViewControllerUINavigationController类的实例来处理此问题,如果是,则将其返回topViewController。这都是作为UIStoryboardSegue类实现的;类别是一种向现有类添加方法或属性以扩展其功能而无需使用继承等的方法。

于 2013-07-07T15:45:33.183 回答