UITableView选中单元格时使用prepareForSegue方法,但didLoadView方法未被调用。

4

我正在学习iOS并且使用iOS 5编写了一个简单的iPhone应用程序。该应用程序显示一个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];    
}

当我选择它并填充扬声器(在其不为空且描述匹配时)时,它将被调用。

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

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

在didSelectRowAtIndexPath中调用了segue的标识符为“Detail”,destinationViewController的发言者设置正确(不为nil,描述匹配)。我不是很确定为什么我必须再次设置它,因为我在didSelectRowAtIndexPath中设置了它,但我又设置了它,似乎没有什么影响。

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

然而,segue从未发生过,viewDidLoad也从未被调用。

可能只是一些小问题,但我无法解决... 有什么建议吗?

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

enter image description here


1
如果你已经在单元格和详细控制器之间定义了一个推送转场,那么在didSelectRow方法中就不需要那些东西了。你有这样的转场吗? - jrturton
@jrturton 是的,从我的故事板中,我有一个“从speakerCell到Speaker Detail View Controller的push segue”。speakerCell是我UITableViewCell的标识符(动态表格的原型),而Speaker Detail View Controller是我子类化的View Controller。我在Segue中添加了名为Detail的标识符以供准备Segue使用。 - knaak
你的视图控制器在Storyboard中都嵌套在导航控制器中吗? - jrturton
@jrturton 不是的。UITableViewController具有根关系,并嵌入到包装的UITabBarController中。UITableViewController具有推送segue到UIViewController(但不起作用)。我尝试删除包装UITabBarViewController,但它具有相同的行为。 - knaak
1个回答

6

为了使push segue正常工作,您必须将视图控制器嵌入导航控制器中。我不知道为什么它允许你在此之前定义它们。

要实现这一点,请单击您的表视图控制器,然后选择Editor --> Embed In --> Navigation Controller。如果您还应该在选项卡栏控制器内部,则以类似的方式将导航控制器嵌入其中。您会看到以下内容:

enter image description here

现在您的segue将正常工作。


谢谢。我以为选项卡控制器是导航控制器的一种,因此我不需要将我的UITableViewController嵌入其中。由于除了segue之外似乎一切正常,所以我集中精力处理它。再次感谢! - knaak
感谢您节省了我大量的时间。 - Arunabh Das

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接