0

嗨,我目前已经推动了选择以让我的表格视图推送到详细视图。我也有这个代码来发送选定的表格单元格的名称:

- (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];
4

2 回答 2

1

如果您使用情节提要,则以下行没有意义:

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

您的项目中是否调用了 NIB 文件DetailViewController.xib?大概不会。因此myDetViewCont将是nil,你会得到一个例外。如果你确实有那个NIB,那么push segue 是什么(因为你不能从storyboard 到NIB)?

假设您真的想使用情节提要,而不是 NIB,如果您已经在控制器之间有一个 push 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__);
        }
    }
}
于 2012-08-14T16:31:58.300 回答
0

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

self.navigationController.navigationBar.hidden = YES;
self.navigationController.navigationBar.translucent = NO;
于 2015-01-30T00:23:38.820 回答