为什么我不能使用segue传递数据

时间:2013-07-07 14:25:18

标签: ios objective-c segue property-list

我有一个含有键和值的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

  3. 这是指这一行:

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

    (在prepareForSegue函数内)。

    请帮我解决这个问题。谢谢,谢谢!

2 个答案:

答案 0 :(得分:2)

看起来你的plist用于生成字典。 NSDictionary中的键(以及值)不是有序的。因此,您获得密钥的顺序并不固定。

因此,当您假设某个键和值位于特定位置时,这是一个错误的假设。

您应该使用数组作为数据源而不是字典。

答案 1 :(得分:1)

关于问题2的可能解决方案的更多细节:

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

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