我有一个基本的故事板设置,我加载了我的NavViewController,然后指向初始视图控制器。然后我有几个额外的视图控制器通过线性方式的segue以菊花链形式连接在一起。当我最初启动我的应用程序时,我在NavControllerViewController.m
中运行以下命令(void)viewDidLoad
{
[super viewDidLoad];
NSArray * controllerArray = [self viewControllers];
NSLog(@"view controllers: %@", controllerArray);
}
日志仅显示第一个根视图控制器(直接“连接”到导航控制器的控制器)。堆栈中缺少所有视图控制器。我的印象是,如果一个视图控制器在我的故事板上,它会自动添加到导航控制器中吗?
如果这不正确,那么从调用VC中实例化每个VC会有一个好的选择吗?例如,如果我想从VC1转换到VC2,我会将以下代码放在VC1中:
UIViewController *vc2 = [self.storyboard instantiateViewControllerWithIdentifier:@"vc2"];
[self pushViewController:vc2 animated:YES];
或者可能:
[self performSegueWithIdentifier:@"vc2Segue" sender:self];
答案 0 :(得分:1)
它们都可以通过segues到达,但它们不会被实例化或被压入堆栈,直到它们被转移到它们。
您可以使用自我执行segue策略或推送视图控制器,或者,如果它是响应单个按钮单击,只需控制从该按钮拖动到下一个视图控制器,Xcode完成其余所有操作为你工作的。
答案 1 :(得分:1)
如果我正确理解你的问题,你的故事板设置看起来类似于下面的屏幕截图。当一个应用程序加载这个故事板时,它肯定只有一个视图控制器在导航控制器堆栈中,这将是根视图控制器。
因为other view controllers are still not pushed into the navigation controller stack
。
在Viewcontroller-1
中,您可以看到一个按钮some Action
,我已经从该按钮创建了push segue
到Viewcontroller-2
。点击该按钮后,第二个视图控制器将被推送到导航控制器堆栈。
如果您现在打印viewcontrollers
计数,则应将计数设为2
。
在View Controller-2中重复相同的操作,现在您可以看到计数凸起为3
。因为现在我们有三个视图控制器被推入导航控制器堆栈。
按back
按钮弹出视图控制器,可以看到视图控制器数量下降,这是因为视图控制器现在正从导航控制器堆栈中删除。
答案 2 :(得分:0)
正如AdamG所说的那样,UIViewController
s不会被推到堆栈上,直到你转向它们。
要设置segue,请选择UIViewController
并控制+将连接拖至目标UIViewController
。在Attributes Inspector选项卡下,设置Storyboard Segue Identifier。
要转换为UIViewController
,请使用方法performSegueWithIdentifier:
。在调用performSegueWithIdentifier:
之前,将调用prepareForSegue:sender:
。您可以在此处传递下一个UIViewController
所需的任何值。要检查调用哪个segue,请使用segue.identifier
中的prepareForSegue:sender:
属性。之后,您可以访问destinationViewController
属性。
如果您需要手动实例化UIViewController
使用instantiateViewControllerWithIdentifer:
。可以在故事板中的Identity Inspector选项卡下设置标识符。