传递Segue给出错误

时间:2012-08-14 15:47:40

标签: iphone ios ios4 sdk

您好我目前已经选择了将表格视图推送到详细视图。我也有这个代码来发送所选表格单元格的名称:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *acell = [tableView cellForRowAtIndexPath:indexPath];
    selectedCell = acell.textLabel.text;

    DetailViewController *myDetViewCont = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:[NSBundle mainBundle]];

    myDetViewCont.navigationItem.title = selectedCell;
    [self.navigationController pushViewController:myDetViewCont animated:YES];

}

它构建成功,但在模拟器中它会抛出错误:

@autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
Thread: 1 signal: SIGABRT

我查找了类似的问题,但还没有找到解决方案。 任何帮助?

关于错误的其他信息:

[self.navigationController pushViewController:myDetViewCont animated:YES];

2 个答案:

答案 0 :(得分:1)

如果您正在使用故事板,那么以下行没有意义:

DetailViewController *myDetViewCont = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:[NSBundle mainBundle]];

您的项目中是否有名为DetailViewController.xib的NIB文件?大概不是。因此myDetViewCont将为nil,您将获得例外。如果你确实有那个NIB,那么推动segue之间会是什么(因为你不能从故事板转向NIB)?

假设你真的想要使用故事板而不是NIB,如果你已经在控制器之间有一个推送segue,给那个segue一个标识符(你在Interface Builder中这样做;在我下面的代码中我只是...使用youridentifier作为您指定的任何占位符,您将使用正确的标识符替换它们,然后您应该使用segue进行转换:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *acell = [tableView cellForRowAtIndexPath:indexPath];
    [self performSegueWithIdentifier:@"youridentifier" sender:acell];
}

如果您想将数据发送到新控制器,请使用prepareForSegue执行此操作:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"youridentifier"])
    {
        if ([sender isKindOfClass:[UITableViewCell class]])
        {
            UITableViewCell *selectedCell = sender;
            UIViewController *myDetViewCont = segue.destinationViewController;
            myDetViewCont.navigationItem.title = selectedCell.textLabel.text;
        }
        else
        {
            NSLog("%s Was expecting sender to be a tableviewcell", __FUNCTION__);
        }
    }
}

答案 1 :(得分:0)

找到解决方案。您需要在故事板中安装UINavigationController。要执行此操作,请执行第一个场景,单击它并转到xcode顶部的选项卡,然后执行编辑器>嵌入>导航控制器,选中按钮将导航控制器设置为初始场景。添加以下代码以隐藏顶部的导航栏。

self.navigationController.navigationBar.hidden = YES;
self.navigationController.navigationBar.translucent = NO;