故事板与alloc / init创建ViewControllers

时间:2015-05-21 05:48:29

标签: objective-c uiviewcontroller ios8 uinavigationcontroller uistoryboard

我正在使用Xcode 6.3,Objective-C。

在我的故事板中,我创建了一个UINavigationController。然后我创建一个UIViewController并将其指定为UINavigationController的根控制器。然后,我创建了第二个UIViewController,并使用"手动显示"将其连接到第一个UIViewController。 SEGUE。

所以我的故事板上有一个UINavigationController和两个UIViewControllers,所有这些都已连线。我在第一个UIViewController中也有一个按钮,其中有一个动作可以显示第二个UIViewController(稍后会详细介绍......)

我的问题是:当应用程序运行时,是否一次创建了所有控制器?

根本问题是,当我点按按钮显示第二个UIViewController时,使用通常的[self.navigationController pushViewController:controller animated:YES],第二个UIViewController是否已经存在 - 因为已创建时故事板被加载和解析?

或者,在推送之前,我是否需要先进行[... alloc] init]

我知道,如果您以编程方式创建UIViewControllers,那么您当然需要执行allocinit。但是我不清楚alloc/init已被创建"是否需要UIViewController。在故事板中?

使用[self performSegueWithIdentifier...]测试连接似乎有效:显示第二个UIViewController,并且没有显式的alloc / init。因此在我看来,当执行segue时,UIKit会创建目标控制器(alloc / init)。你不需要做那个部分。

但是,如果我想使用UIViewController方法显示第二个...pushViewController:controller...,我将如何获得指向它的指针? UIViewController中的UINavigationController数组只有一个元素,而不是两个 - 这是有意义的:这个数组只有在被推送时才会添加第二个控制器的引用在堆栈上。

所以,再次,如果我想做一个...pushViewController:controller...,并假设第二个UIViewController确实存在(因为它是由故事板创建的),我怎样才能得到它的指针 - 在第一个控制器?

或者,我是否必须首先使用" alloc / init"显式创建它,这当然给了我指针?

在我看来,如果故事板创建了所有控制器,那么对它们的引用必须存在于某处。

如果是这样,做一个" alloc / init"第二个控制器上的步骤,当它已经由故事板创建时,是多余的,对吗?

或者,即使我在故事板中创建了第二个UIViewController,我仍然需要使用" alloc / init"来实例化它。消息?

当然,对第二个控制器进行手动调整是没有意义的,因为你没有利用UINavigationController,事实上它是多余的。因此,要利用导航,您必须使用...pushViewController:controller...方法,这需要指向第二个控制器的指针。天真的,这表明" alloc / init"需要。但是,我再也不明白为什么当故事板(如果我理解正确的话)会为我做这个时,你需要显式创建类实例。

我知道做" alloc / init"只创建对象;没有设置任何属性。为此,我需要instantiateViewControllerWithIdentifier。但是我仍在手动创建第二个控制器,对吗?因此故事板不会在运行时为我实例化它们吗?

我知道故事板调用initWithCoder然后调用awakeFromNib,这表明故事板实际上在应用程序运行时实例化这些对象。但是当应用程序运行时它是否会这样做,或者我是否还需要手动明确地执行某些操作?我仍然追求的是指向第二个控制器的指针,用于推送,以及我在何处/如何获得此指针。

很抱歉这个长期问题:我只想更清楚地了解到目前为止我所理解的内容以及我的问题。是的,我是一个iOS n00b - 这就是为什么我来这里寻求专家帮助。为此,我提前感谢你。

2 个答案:

答案 0 :(得分:2)

如果您在故事板中创建了UIViewControllers,它们似乎一下子就被初始化了。如果您使用的是故事板,则不需要分配/ init。使用segues。如果您不想使用segues,请使用:

//这里我们以编程方式实例化一个视图控制器

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"View controller storyboard id"];

在Storyboard(身份检查器)中设置故事板ID:)

然后只需添加到Push a ViewController:

[self.navigationController pushViewController:controller animated:YES];

或者,如果您不使用导航控制器:

[self presentViewController:controller animated:YES completion:nil];

答案 1 :(得分:1)

  

我的问题是:当应用程序运行时,是否一次创建了所有控制器?

不,只创建了初始控制器(故事板中带箭头的控制器)。如果它是Navigation controller,它的根视图控制器也将被创建。

  

或者,在进行推送之前,我是否需要先执行[... alloc] init]?

是的,在将其推入导航堆栈之前,您必须alloc init ViewController initWithCoder:。它尚未创建。

如果您使用故事板,它将调用prepareForSegue:来初始化您的视图控制器。然后,您可以通过alloc init方法设置属性。

如果你使用编码方法,只需pushToViewController你的控制器,设置它的属性和prepareForSegue:

简单,对吧?

  

如何在第一个控制器中获取指向它的指针?

Ya,通过segue.destinationViewController方法,您的新控制器为COL1 COL2 COL3 ---------------- 1 A XXXX 1 B LLLL 1 F TTTT 5 B GGGG 5 C VVVV 7 D FFFF 7 E AAAA 7 S SSSS

...

我认为这已经足够了,我的回答几乎涵盖了你所有的问题。如果您需要进一步解释,请随时问我。