4

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

问题 #1 - SequeA 将呈现 DetailA 的代码位于何处

问题 #2 - 在我的 AppDelegate 代码中,我需要创建应用程序中所有 ViewControllers 的数组 - 我怎样才能获得该数组?- 它在故事板中,但我如何以编程方式访问它。

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

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

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

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

4

3 回答 3

1

1) 如果你在 IB 中连接它,则没有代码(除了描述情节提要的 XML 文件)。

2)在实例化它们之前,您无法访问其他控制器。

3) 它在执行 segue 时被实例化。

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

于 2013-01-30T15:53:54.670 回答
1

如果您阅读链接,您将了解没有代码可以按照您的要求执行 segue。. . XCode / Interface Builder)不是代码生成器,如果您使用其他语言的界面构建器,您可能会理解它,它不是为您编写代码,因此找不到。话虽如此,您可以以编程方式调用 segue。

至于列出 ViewControllers,我不相信有办法以您希望的方式做到这一点。ViewController 只是特定类型的类。您唯一能做的就是获取所有已加载类的列表并通过检查它们是否是视图控制器进行迭代,但这会很慢,我不确定您为什么要这样做,毕竟这是唯一的方法将执行的代码将包含在您的项目中,并且您肯定知道您的项目中有哪些代码?

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

于 2013-01-30T16:01:30.550 回答
0

您询问:

问题 #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);
  • 只有这样,目标视图才能完成其布局、外观调用等。

参考:

于 2013-01-30T16:15:22.613 回答