我正在使用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
,那么您当然需要执行alloc
和init
。但是我不清楚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 - 这就是为什么我来这里寻求专家帮助。为此,我提前感谢你。
答案 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
...
我认为这已经足够了,我的回答几乎涵盖了你所有的问题。如果您需要进一步解释,请随时问我。