iOS Segue - 视图控制器何时被实例化?

4
我有一个简单的故事板,包括一个主视图控制器和两个详细视图控制器,如图所示。 问题#1 - SequeA呈现DetailA的代码在哪里? 问题#2 - 在我的AppDelegate代码中,我需要创建一个包含App中所有视图控制器的数组 - 如何获取该数组?它在storyboard中,但我如何以编程方式访问它。
我可以通过以下方式获得MainViewController - myViewControllerMain = (ViewControllerMain*) self.window.rootViewController;
但是我不知道如何访问详细的视图控制器(a&b)。 问题#3 - 在实例化MainViewController时,DetailA是否已实例化,还是在"触发"(这里使用什么词比较恰当?)Seque时实例化?
图片链接:https://istack.dev59.com/Rk7VM.webp

http://www.raywenderlich.com/5138/beginning-storyboards-in-ios-5-part-1 - codeghost
我已经查看了rayWenderlich的链接。那里有一个引用可以访问主视图控制器 - 但我已经知道了。据我所知,它没有解决如何访问其他视图控制器的问题。由于我没有使用导航控制器 - 在故事板中必须有一些东西告诉我所有其他视图控制器是什么。 - OneGuyInDc
我会添加一个答案,因为评论中没有足够的空间。 - codeghost
我已经尝试回答你下面的问题,但我必须承认这些问题本身就引发了一些问题。为什么A或B需要知道视图控制器列表?你能解释一下你想做什么吗?基于你的问题,我可能会推断这是一个自定义容器视图控制器的候选项(这是一个非常不同的话题,与我们所有人回答的内容都不同),但你需要更详细地解释主控制器在做什么,A和B在做什么等等。你能用更少抽象的术语描述工作流程或业务逻辑吗?我们将能够提供更有建设性的建议。 - Rob
3个回答

1

1) 如果您在IB中连接了它,则没有代码(除了描述故事板的XML文件)。

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

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

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


1
如果您阅读链接,您就会明白没有代码可以执行所请求的segue... XCode/Interface Builder不是像您在其他语言中使用界面构建器时理解的代码生成器,它不会为您编写代码,因此没有可找到的代码。话虽如此,您仍然可以通过编程方式调用segue。
至于列出ViewControllers,我不认为有一种希望的方法可以这样做。ViewControllers只是特定类型的类。唯一能做的事情就是获取所有已加载的类的列表,并进行迭代以检查它们是否是视图控制器,但这将很慢,而且我不确定您为什么要这样做,毕竟执行此代码的唯一方式是将其包含在您的项目中,而您肯定知道您的项目中有哪些代码?
当执行segue时,视图控制器被实例化。

感谢您的澄清 - 我来自 .Net/C#,这个概念略有不同。 - OneGuyInDc

0

您的问题:

问题1 - SegueA将呈现DetailA的代码位于何处?

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

Question #2 - In my code for the AppDelegate I need to create an array of all the ViewControllers that are in the App - How can I get that array? - It is in the story board but how do I programmatically access it.

I can get the MainViewController by doing the following -

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

but I don't know how to access the detail view controllers (a & b)

通常情况下,您不需要维护视图控制器的数组(可能是自定义容器视图控制器的例外情况,即使是这样,有时候也不必自己这样做)。但是,如果您需要访问应用程序委托的某个属性,可以像下面这样操作:
YourAppDelegate *appDelegate = (YourAppDelegate *)[UIApplication sharedApplication].delegate;
// you can now access properties of the `appDelegate`

说到这一点,我很难想象在哪些情况下建议Detail Controller A或Detail Controller B从主控制器中检索视图控制器列表。您真的应该解释一下您要解决的业务问题。通常,您会执行某些委托协议或使用某些通知过程。它因解决的问题而异。但是,如果A或B需要从主控制器获取视图控制器列表,则应仔细查看设计。
“问题#3” - 当实例化MainViewController时,是否实例化DetailA,还是在Seque“触发”(这里的正确单词是什么-调用?)
除自定义容器和/或嵌入式segue外,基本过程如下:
  • 触发segue;
  • iOS 6中可选调用shouldPerformSegueWithIdentifier,如果返回NO则停止执行;
  • 实例化目标控制器;
  • 调用prepareForSegue,允许您将信息从源控制器传递到目标控制器;
  • 创建与目标视图控制器相关联的视图;
  • 调用目标控制器中的viewDidLoad(重要提示:不要在此之前尝试操作目标视图中的视图/控件,例如在源控制器的prepareForSegue中);
  • 只有在此之后,目标视图才会完成其布局、外观调用等。

参考资料:


感谢您详细的回复。 我能否获取Segue标识符列表。在storyBoard中,我的MainView通过Segue连接到ViewA。在InterfaceBuilder中,该segue已提供一个标识符,它是一个字符串。我不想在代码中硬编码该字符串,而只是检查是否调用了Segue“X”。Segue X是一个对象-为什么我要依赖于一个字符串来查询调用了哪个Seque。 - OneGuyInDc
@OneGuyInDc 没有持久化的 Segue X 对象。无论如何,shouldPerformSegueWithIdentifierperformSegueWithIdentifier 只有 标识符字符串,因此没有其他可用的东西供您使用。在 prepareForSegue 中的 UIStoryboardSegue 对象每次执行时都会重新实例化,因此您无法进行比较。标识符 是建议的技术。另一种方法是子类化 segues 并查看类成员身份,但这需要大量额外的工作,并且会显着降低可读性,而没有真正的好处。 - Rob
DetailViewControllerA或DetailViewControllerB何时被“销毁”?(抱歉,我的C++根源)换句话说,在DetailViewControllerB中,我有一个按钮,当点击它时会执行以下操作:[self dismissViewControllerAnimated:NO completion:nil];上述代码是否会销毁DetailViewControllerB?我认为并没有发生这种情况。 - OneGuyInDc
dealloc没有被调用 - 以下代码如何创建强引用
  • (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"analog"]) { ViewControllerAnalog *vca = segue.destinationViewController; vca.AnalogVoltageA = myAnalogVoltageADataPoint; vca.AnalogVoltageB = myAnalogVoltageBDataPoint; } else if ([segue.identifier isEqualToString:@"temperature"]) { ViewControllerTemperature *vcb = segue.destinationViewController;
    vcb.TemperatureDataPoint = myTemperatureDataPoint; }
}
- OneGuyInDc
@fatuhoku 过程非常相似,只是嵌入式segue会在父视图实例化时自动执行,而不是作为某些用户交互的结果执行。 - Rob
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接