iOS Segue – 何时viewControllers实例化
我有一个简单的故事板,有一个主视图控制器和两个细节视图控制器,如图所示。
问题#1 – SequeA将呈现DetailA所在的代码在哪里
问题2 – 在我的AppDelegate代码中,我需要创build一个包含在App中的所有ViewController的数组 – 我如何获得这个数组? – 这是在故事板,但我如何以编程方式访问它。
我可以通过执行以下操作来获取MainViewController:myViewControllerMain =(ViewControllerMain *)self.window.rootViewController;
但我不知道如何访问详细视图控制器(A&B)
问题3 – DetailA是在MainViewController被实例化的时候实例化的,还是在Seque被“触发”的时候被实例化的(这里的什么是正确的 – 被调用?)
你问:
问题#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一个你所有控制器的数组?