performSegueWithIdentifier 不起作用

Posted

技术标签:

【中文标题】performSegueWithIdentifier 不起作用【英文标题】:performSegueWithIdentifier doesn't work 【发布时间】:2012-05-01 06:47:50 【问题描述】:

我的主视图控制器位于导航控制器中,它符合EditViewControllerDelegate 协议。这是我需要以模态方式呈现的两个视图控制器的委托。

@interface EditViewController : UIViewController
@property (nonatomic) id <EditViewControllerDelegate> delegate;
@end

@interface EditSomethingViewController : EditViewController
@end

@interface EditSomethingElseViewController : EditViewController
@end

editViewController:(EditViewController *)evc didFinishEditing:(Something *) something 方法中,我首先获取所需的数据,然后关闭 evc 并调用

[self performSegueWithIdentifier:@"My Segue" sender:self];

“My Segue”在 Xcode 中定义,标识符在代码和 Xcode 中是相同的(我试图更改它只是为了查看它是否被调用并引发异常)

当我将“My Seque”的类型更改为 push 时,它起作用了。 但是在我回到主视图控制器后,它不会做任何事情

我错过了什么?

已编辑:

我不小心在我的故事板中发现了一个警告! (这很奇怪,因为它不是项目中“随处可见”的警告) 在“引用故事板转场”下的连接检查器中,我的模态转场有一个警告。它说:

(null) is not a valid containment controller key path

我检查了其他模态序列,也有同样的警告,但我不需要通过代码触发它们,所以之前没有问题。

编辑 2:

-(void)editViewController:(EditViewController *) evc
didFinishEditing:(Something *) something

    self.something = something;
    [self dismissModalViewControllerAnimated:YES];
    For ( OtherThing * otherThing in self.something.otherthingsArray)
    
        NSLog(@"%@", otherThing);
    
    [self performSegueWithIdentifier:@"My Segue" sender:self];

【问题讨论】:

你能告诉我们你的整个 editViewController:(EditViewController *)evc didFinishEditing:(Something *)something 方法吗? 现在除了 NSLog 来查看“某事”的描述之外,它什么也不做。我刚刚添加了一个 NSlog 到 prepareForSegue,它被调用了,但是 segue 没有在屏幕上执行。 我以为您说您正在关闭编辑视图控制器并在该方法中调用 performSegueWithIdentifier。你在哪里做这些事情?我想看看你是怎么做这部分的,看看是不是错在哪里。 是的,当然!但我没有别的意思。我将把它添加到问题中只是为了消除歧义。(编辑 2) 视图应该如何执行:[self performSegueWithIdentifier:@"My Segue" sender:self];如果它在 [self dismissModalViewControllerAnimated:YES] 之前解雇自己; ? 【参考方案1】:

您需要等到其他视图控制器完成动画后,才能执行转场。您可以使用新的 ios 5 方法:

[self dismissViewControllerAnimated:YES completion:^() 
    [self performSegueWithIdentifier:@"My Segue" sender:self];
];

如果您需要 iOS 5 之前的方式来执行此操作,您应该在执行 segue 之前添加一个延迟以给动画时间。

【讨论】:

傻了我...如果你使用 performSegueWithIdentifier:,你必须使用 iOS5,所以你肯定也应该使用 dissmissViewControllerAnimated:completion:! 另外,我不知道这是否能解决你所有的问题,但这是朝着正确方向迈出的一步——你绝对应该这样做。 完美!现在可以了。谢谢!我想这是关于在不同线程中运行的动画,对吧?因此调用了 performSegueWithIdentifier 但在动画完成之前...我尝试使用 dismissModalViewControllerAnimated:NO 运行它,它也能正常工作。 关于“(null) 不是有效的收容控制器密钥路径”的任何线索? 我认为“(null)”警告只是一个 Xcode 错误。没什么好担心的。【参考方案2】:

就我而言,我能够成功执行一次转场;但不是以后的时间。没有抛出特别的致命错误,使用DispatchQueue.main.async 也没有帮助我。

最后,我记得我曾经在一个单独的分支上工作过。该决议最终变得非常愚蠢。在我使用“显示细节”风格的转场的地方,我不得不将其更改为“呈现模态”转场。无论出于何种原因,这让我可以再次执行多次。

【讨论】:

以上是关于performSegueWithIdentifier 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

performSegueWithIdentifier 出现运行时错误,为啥?

iOS8 performSegueWithIdentifier 运行太慢

performSegueWithIdentifier:sender: 找不到我的转场

unwind segue / performSegueWithIdentifier: 问题

performSegueWithIdentifier 不起作用

performSegueWithIdentifier:从 didSelectRowAtIIndexPath 调用的方法缓慢显示视图