presentViewController和pushViewController之间的不同结果

时间:2013-07-14 06:31:39

标签: iphone ios uiviewcontroller segue uistoryboardsegue

我对两次尝试以编程方式实例化并打开一个新视图之间的不同结果感到有些困惑。我有一个由NSTimer回调调用的方法(虽然我不认为它是如此相关),它试图分配和初始化第二个视图控制器,并将其推入堆栈(我可能有一些我的命名法在那里,抱歉)。

看看ViewController编程指南和这里的几个答案,我已经确定了两个可能的解决方案,这两个解决方案都构建并运行良好,但我得到的结果不同,但两者都没有完全发挥作用。

第一个使用presentViewController方法。它看起来像这样:

SecondViewController *secondView = [[SecondViewController alloc] init];
[self presentViewController:secondView animated:YES completion:NULL];

......并且以某种方式起作用。我将一个NSLog放在SecondViewController类的viewDidLoad方法中,然后打印出来。如果我也在那里以编程方式设置UIColor,则屏幕颜色。但是,我在故事板中放置在此VC视图上的任何内容都不会显示 - 如果我不以编程方式为视图着色,则屏幕为黑色。

我尝试的第二种方式,因为我认为代码没有正确连接到我的故事板(这是一种较旧的方法,仍然适用于XIB的afaik)。它看起来像这样:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
SecondViewController *secondView = (SecondViewController *)
[storyboard instantiateViewControllerWithIdentifier:@"secondView"];
[self.navigationController pushViewController:secondView animated:YES];

...但是viewDidLoad和界面似乎都没有响应/被调用。

我还看了一个prepareForSegue方法,但我不确定它是否会有所作为,因为我很确定我会遗漏一些东西......

我应该注意,我已经在Identity Inspector下设置了ViewController的Storyboard ID。

如果有人能解释我的问题的直接解决方案和/或我正在经历的问题的更大解释,那将非常感激。

~Jesse

2 个答案:

答案 0 :(得分:1)

使用presentViewController的第一个解决方案/问题,创建和演示很好,但故事板根本不涉及。如果您在代码中创建视图内容(如颜色),或者如果init方法加载了NIB或其他东西,那么一切都会很棒。

第二种方法看起来应该有效,因此可能是故事板的名称错误,标识符名称错误,或navigationController为零。

只有在用户交互触发segue时才会调用prepareForSegue方法,其中在故事板中配置了segue或者是从代码专门触发的segue。

通常,您希望主要使用1种形式来创建视图过渡。如果您正在使用故事板,那么通常会在故事板中配置segue并链接到UI项目。然后,您将在“源”视图控制器中实现prepareForSegue,以传递“目标”视图控制器所需的任何其他信息。您应该完成this guide

答案 1 :(得分:0)

所以,感谢Wain的回答和评论,我得到了这个,以编程方式实例化我的Storyboard中的新UIViewController。在使用自定义UIViewController创建模态(请参阅注释)segue到第二个Identifier之后,我只需从我的performSegueWithIdentifier调用我的回调方法中的NSTimer方法。似乎我有太多的代码,并且过度思考需要在我的第一个内部以编程方式进行第二次UIViewController。这是我的代码的相关部分:

- (void)viewDidLoad {
    [super viewDidLoad];

    if(self.timer == nil) {
        self.timer = [NSTimer scheduledTimerWithTimeInterval:2.5 target:self selector:@selector(switchView) userInfo:nil repeats:NO];
    }

}

- (void) switchView {
    [self performSegueWithIdentifier:@"timerDone" sender:self];

    [timer invalidate];
    self.timer = nil;       
}