推送到另一个视图控制器没有prepareForSegue

时间:2013-03-12 20:58:52

标签: ios objective-c uiviewcontroller uistoryboardsegue pushviewcontroller

如何在没有prepareForSegue的情况下推送到另一个视图控制器?

myClassVC *viewController = [myClassVC alloc];
UIStoryboardSegue *segue = [[UIStoryboardSegue alloc] initWithIdentifier:@"pushToMyVC" source:self destination:viewController];

if ([segue.identifier isEqualToString:@"pushToMyVC"]) {
 NSLog(@"logging");
 myClassVC *viewController = (myClassVC *)[segue destinationViewController];
 [self presentViewController:viewController animated:YES completion:nil];        
}

4 个答案:

答案 0 :(得分:45)

如果你想以编程方式调用push segue,你可以在Interface Builder中给segue一个“storyboard id”,然后你可以:

[self performSegueWithIdentifier:"pushToMyVC" sender:self];

或者,如果您不想执行segue,则可以实例化目标视图控制器,然后手动推送到该视图控制器。您需要做的就是确保目标视图控制器在Interface Builder中有自己的“故事板ID”,然后您可以:

UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DestinationController"];
[self.navigationController pushViewController:controller animated:YES];

你说“推”(因此我使用上面的pushViewController)。如果你真的想“呈现一个模态视图控制器”,那么第二行是:

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

如您所见,您 无法使用prepareForSegue推送到新场景。如果要将信息传递到目标视图控制器,则只能使用prepareForSegue。否则就不需要了。

显然,如果你没有使用故事板(例如,你正在使用NIB),那么这个过程就完全不同了。但我假设您没有使用NIB,因为prepareForSegue不适用于该环境。但是如果你使用的是NIB,那将是如下:

SecondViewController *controller = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];

答案 1 :(得分:3)

不需要

[self presentViewController:viewController animated:YES completion:nil];,因为segue将使用您自动选择的转换推送目标视图控制器。

如果您不想使用segue进程,则需要手动推送视图控制器:

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

但请务必先删除故事板中的segues。

答案 2 :(得分:0)

   NSString * storyboardName = @"Main";
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewControllerID"];
    [self presentViewController:vc animated:YES completion:nil];

答案 3 :(得分:0)

在我的例子中,所有viewControllers都是动态构建的。我没有为此目的使用故事板。如果这是你的情况,你可以实例化你要打开的viewController类,并按下面的例子进行推送:

MyViewController* myViewController = [[MyViewController alloc] init];
[self.navigationController pushViewController:myViewController animated:YES];