0

我有一个从 FirstViewController 导航到 SecondViewController 的 segue。这通过按下按钮来实现。按钮的代码是

- (IBAction)segue:(id)sender {
[self performSegueWithIdentifier:@"myIdentifier" sender:self];
}

当我按下按钮时,这会正确发生。

我想要做的是从另一个角度触发这个方法。我试着做

FirstViewController fvc = [[FirstViewController alloc] init];
[fvc segue:nil];

当我尝试这个时,我收到错误消息,Reciever has no segue with identifier 'myIdentifier'

我如何从另一个角度以编程方式触发这个 segue?

4

1 回答 1

2

这里有一些问题,但它们归结为几个关键点:

  • Segues 是一个故事板的东西,因此视图控制器只有在从故事板实例化时才“知道”segues。
  • 视图控制器必须在屏幕上才能执行转场。
  • Segue 是从一个特定视图控制器到另一个特定视图控制器的转换。

因此,在您的代码段中:

FirstViewController fvc = [[FirstViewController alloc] init];
[fvc segue:nil];

第一个问题是alloc- init-ing 给你一个实例,FirstViewController它不知道它来自的故事板,所以它不知道任何关于 segues。(仅此一项可以使用 [ instantiateViewControllerWithIdentifier:][1] 修复,但这并不能解决您的全部问题。)第二个问题是该实例不适合 UI 层次结构的任何位置——它没有被呈现为modal 视图控制器,它不是当前导航控制器中的顶部视图控制器,也不是可见窗口的根视图控制器等。为了将屏幕从一个视图转换到另一个视图,第一个视图需要在屏幕上。

听起来您想要做的是从当前屏幕上的内容过渡到此 segue 的目标。但是故事板转场的概念不仅仅是带有目的地的过渡——它是源、目的地以及它们之间的过渡或关系。如果您有不同的源视图,则需要不同的 segue。所以,如果你已经有一个从FirstViewController到的转场,并且你想从(假设现在是屏幕上的那个)到SecondViewController进行类似的转换,你需要做第二个转场连接到。OtherViewControllerSecondViewControllerOtherViewControllerSecondViewController

于 2013-04-18T15:56:13.010 回答