注册自定义单元格时,prepareForSegue未被调用

3

这不是segue标识符拼写错误之类的问题。当我点击tableViewController中的单元格时,prepareForSegue方法实际上并没有被调用。控制语句之前的日志语句在我添加新单元格时记录,但在我点击单元格时却没有。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSLog(@"prepare for segue"); //not getting logged if I tap on an existing cell
    if ([[segue identifier] isEqualToString:@"AddTopic"]) {
        //
        works fine to add a new cell
    }
    if ([[segue identifier] isEqualToString:@"ShowDetail"]){
        NSLog(@"in segue to display edit");

        MMDisplayEditViewController *devc = (MMDisplayEditViewController *)[segue destinationViewController];

您可以在下面的图像中看到,在表视图控制器中,从单元格到显示编辑视图控制器设置了推送转场。为什么可能不会调用prepareForSegue?请注意,我正在为表视图单元格使用自定义类,但我不知道这会影响任何内容。更新:我在主表视图控制器的viewDidLoad中注册了自定义单元格。
- (void)viewDidLoad
{
    [super viewDidLoad];
     [self.tableView registerClass:[MMTableViewCell class] forCellReuseIdentifier:@"Cell"];

在这种情况下,@KerrM的解决方案应该有效。 - Pawan Rai
1
你接受的答案只是一个解决方法,而不是对你问题的回答。根据你所描述的设置,prepareForSegue应该被调用,因此一定还有其他问题。你是如何连接“添加主题”segue的?即使prepareForSegue没有被调用,下一个控制器的segue是否能够正常执行? - rdelmar
@rdelmar,addTopic的segue工作得非常完美,也就是说当我点击按钮添加新主题时,prepareForSegue会被调用。但是只有在我点击现有单元格时,prepareForSegue不会被调用?为了设置addTopic segue,我从“+”按钮控制性拖动到add topic视图控制器。 - BrainLikeADullPencil
当您点击单元格时,segue本身是否起作用 - 是否转到详细视图控制器? - rdelmar
让我们在聊天中继续这个讨论 - rdelmar
显示剩余7条评论
3个回答

2
问题是由于在viewDidLoad中注册了单元格的类所引起的。
[self.tableView registerClass:[MMTableViewCell class] forCellReuseIdentifier:@"Cell"];

您在故事板中设置了segue,但通过注册您的类,表视图从类定义中获取其单元格,而不是从具有附加segue的故事板中获取。要解决此问题,只需删除该行即可。
这方面的文档有些不完整。如果单元格完全是使用代码创建的,则应仅注册类。您使用自定义单元格并不会改变这一事实 - 如果您在故事板中有一个单元格,并将其设置为自定义类,则不应注册任何内容。

那么,如果我想在自定义的nib中布局单元格,我该怎么做呢? - Blaszard

1

不要从单元格链接到下一个视图控制器,而是从视图控制器链接到下一个视图控制器。为该segue指定标识符,并实现委托方法tableView:didSelectRowAtIndexPath,如下所示:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   [self performSegueWithIdentifier:@"identifier" sender:indexPath];
}

我还有另一个基于表视图的应用程序,我不必像那样实现该方法。 - BrainLikeADullPencil

-1

如果您在Storyboard中的segue中添加了名称“ShowDetail”,则可以在didSelectRowAtIndexPath中使用以下代码:

[self performSegueWithIdentifier:@"societe" sender:indexPath];

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