iOS Segue – 何时viewControllers实例化

我有一个简单的故事板,有一个主视图控制器和两个细节视图控制器,如图所示。

问题#1 – SequeA将呈现DetailA所在的代码在哪里

问题2 – 在我的AppDelegate代码中,我需要创build一个包含在App中的所有ViewController的数组 – 我如何获得这个数组? – 这是在故事板,但我如何以编程方式访问它。

我可以通过执行以下操作来获取MainViewController:myViewControllerMain =(ViewControllerMain *)self.window.rootViewController;

但我不知道如何访问详细视图控制器(A&B)

问题3 – DetailA是在MainViewController被实例化的时候实例化的,还是在Seque被“触发”的时候被实例化的(这里的什么是正确的 – 被调用?)

带有MainViewController的StoryBoard和两个细节视图

你问:

问题#1 – SegueA将呈现DetailA的代码在哪里?

如果以编程方式调用segue A(例如,调用performSegueWithIdentifier ),则该代码位于主视图控制器中。 通常情况下,您不需要以编程方式调用它,因为当您在Interface Builder中创buildSegue时,通常会将其从某个控件(如主视图中的button)链接到该控件,因此您不需要必须以编程方式做任何事情来启动赛格。 但是,当您调用segue A时,可选的关联的shouldPerformSegueWithIdentifier (iOS 6及更高版本)和prepareForSegue在主视图控制器中调用。

问题2 – 在我的AppDelegate代码中,我需要创build一个包含在App中的所有ViewController的数组 – 我如何获得这个数组? – 这是在故事板,但我如何以编程方式访问它。

我可以通过执行以下操作来获取MainViewController:

 myViewControllerMain = (ViewControllerMain*) self.window.rootViewController; 

但我不知道如何访问详细视图控制器(A&B)

一般来说,你不需要维护视图控制器的数组(可能除了自定义容器视图控制器,即使这样,有时你不必自己做)。 但是,如果您需要访问应用程序委托的某些属性,则可以执行如下操作:

 YourAppDelegate *appDelegate = (YourAppDelegate *)[UIApplication sharedApplication].delegate; // you can now access properties of the `appDelegate` 

话虽如此,但我很难想到在详细控制器A或详细控制器Bbuild议从主控制器获取视图控制器列表的情况下。 你真的应该解释你想要解决什么业务问题。 一般你会做一些委托协议或使用一些通知过程。 这取决于您正在解决的问题。 但是,如果A或B需要从主设备获取视图控制器列表,则应该仔细研究一下devise。

问题3 – DetailA是在MainViewController被实例化的时候实例化的,还是在Seque被“触发”的时候被实例化的(这里的什么是正确的 – 被调用?)

除了自定义容器和/或embedded段,基本过程是:

  • 触发Segue;
  • shouldPerformSegueWithIdentifier在iOS 6中调用shouldPerformSegueWithIdentifier ,否则我们停在这里;
  • 目的地控制器被实例化;
  • prepareForSegue被调用,允许您将信息从源控制器传递到目标控制器;
  • 然后创build与目标视图控制器相关联的视图;
  • 调用目标中的viewDidLoad (take home消息是,不要试图在这个目标视图之前操作视图/控件,比如源代码的prepareForSegue )。
  • 只有目标视图才能完成其布局,外观调用等。

参考文献:

  • 视图控制器编程指南是故事板,视图控制器等的一个很好的概述。

如果你阅读这个链接,你会明白,没有代码来执行你所问的segue。 。 。 XCode / Interface Builder)并不是一个代码生成器,因为如果你使用其他语言的接口构build器,你可能会理解它,它不会为你编写代码,所以没有任何东西可以find。 这就是说,你可以以编程方式调用一个segue。

至于列出的ViewControllers,我不相信有一种方式来做你希望的方式。 ViewControllers只是一个特定types的类。 你可以做的唯一的事情是获得所有加载的类的列表,并通过检查它们是否是视图控制器来进行迭代,但这会很慢,我不知道为什么要这么做,毕竟只有这样代码将被执行将被包括在您的项目中,当然你知道你的项目中有什么代码?

视图控制器在执行segue时被实例化。

1)如果你把它连接到IB,没有代码(描述故事板的XML文件除外)。

2)除非实例化,否则无法访问其他控制器。

3)执行segue时被实例化。

为什么认为你需要在应用程序委托中创build一个你所有控制器的数组?