使用prepareForSegue的UITableView didSelectRowAtIndexPath但未调用didLoadView

时间:2012-02-23 14:56:44

标签: iphone objective-c ios5

我正在学习iOS,我使用iOS 5编写了一个简单的iPhone应用程序。该应用程序显示了一个填充了Speakers名称的UITableView,当我选择其中一个应该转到UIViewController的名称并显示有关该人的详细信息时(名称,地址等),所以它真的有两个ViewControllers,一个UITableViewController和UIViewController(都是子类)。

所以,在MICSpeakersTableViewController:UITableViewController我有这个:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    MICSpeakerDetailViewController *detailViewController = [[MICSpeakerDetailViewController alloc] initWithNibName:@"Detail" bundle:nil];    

    [detailViewController setSpeaker:[[self getSpeakers] objectAtIndex:indexPath.row]];
    [self.navigationController pushViewController:detailViewController animated:YES];    
}

当我选择它并填充说话者时会被调用(因为它不是nil和描述匹配)。

然后我在同一个实现中有这个:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSIndexPath *indexPath = [ self.tableView indexPathForCell:sender];

    if ([segue.identifier isEqualToString:@"Detail"])
        [segue.destinationViewController setSpeaker:[[self getSpeakers] objectAtIndex:indexPath.row]];
}

还调用了哪个,并且segue.identifier是Detail,并且destinationViewController的扬声器设置正确(不是nil,描述匹配)。我不太清楚为什么我必须再设置它,因为我在didSelectRowAtIndexPath中设置它但我再次设置它似乎无害。

最后,在MICSpeakerDetailViewController中,调用initWithNibName方法并且self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];返回一个实例。

然而,segue永远不会发生,并且从不调用viewDidLoad。

它可能很小但我无法弄清楚......有什么建议吗?

编辑:这是故事板的屏幕截图,显示了segue和控制器:

enter image description here

1 个答案:

答案 0 :(得分:6)

您必须将视图控制器嵌入导航控制器中才能使推送segues工作。我不知道为什么它可以让你在没有这个的情况下定义它们。

要执行此操作,请单击表视图控制器,然后选择编辑器 - >嵌入 - >导航控制器。如果您也应该位于标签栏控制器中,则导航控制器以类似的方式嵌入其中。您应该看到以下内容:

enter image description here

你的segue现在可以使用了。