您询问:
问题 #1 - SegueA 将呈现 DetailA 的代码在哪里?
如果您以编程方式调用 segue A(例如调用performSegueWithIdentifier
),则该代码位于主视图控制器中。但是,通常,您根本不需要以编程方式调用它,因为当您在 Interface Builder 中创建 segue 时,您通常会从某个控件(例如主视图中的按钮)链接它,因此您不需要必须以编程方式执行任何操作来启动 segue。但是,当您调用 segue A 时,可选关联shouldPerformSegueWithIdentifier
(对于 iOS 6 及更高版本)并prepareForSegue
在主视图控制器中调用。
问题 #2 - 在我的 AppDelegate 代码中,我需要创建应用程序中所有 ViewControllers 的数组 - 我怎样才能获得该数组?- 它在故事板中,但我如何以编程方式访问它。
我可以通过执行以下操作来获取 MainViewController -
myViewControllerMain = (ViewControllerMain*) self.window.rootViewController;
但我不知道如何访问详细视图控制器(a & b)
通常,您不需要维护视图控制器数组(自定义容器视图控制器可能例外,即使那样,有时您也不必自己做)。但是,如果您需要访问应用程序委托的某些属性,您可以执行以下操作:
YourAppDelegate *appDelegate = (YourAppDelegate *)[UIApplication sharedApplication].delegate;
// you can now access properties of the `appDelegate`
话虽如此,我很难想到细节控制器 A 或细节控制器 B 建议从主控制器检索视图控制器列表的情况。您确实应该解释您要解决的业务问题。通常你会做一些委托协议或使用一些通知过程。它根据您要解决的问题而有所不同。但是,如果 A 或 B 需要从 master 获取视图控制器列表,您应该仔细检查您的设计。
问题 #3 - DetailA 是在 MainViewController 被实例化时被实例化,还是在 Seque 被“触发”时被实例化(这里的正确词是什么 - 被调用?)
除了自定义容器和/或嵌入 segue,基本过程是:
- segue被触发;
shouldPerformSegueWithIdentifier
在 iOS 6 中可以选择调用,如果NO
我们在此停止;
- 目标控制器被实例化;
prepareForSegue
被调用,允许您将信息从源控制器传递到目标控制器;
- 然后创建与目标视图控制器关联的视图;
viewDidLoad
在目的地被调用(带回家的消息是,在此之前不要尝试操作此目的地视图中的视图/控件,例如源中的prepareForSegue
);
- 只有这样,目标视图才能完成其布局、外观调用等。
参考: