在不使用prepareForSegue的情况下推送到另一个视图控制器

11

如何在没有使用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个回答

46

如果您想以编程方式调用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];
你说了“push”(因此我在上面使用了pushViewController)。如果你真的想“呈现一个模态视图控制器”,那么第二行代码是:
[self presentViewController:controller animated:YES completion:nil];

正如您所看到的,您不必使用 prepareForSegue 来推送到新场景。只有在想要将信息传递到目标视图控制器时才使用 prepareForSegue 。否则它是不必要的。

显然,如果您没有使用storyboard(例如,您正在使用NIB),那么过程完全不同。但我假设您没有使用NIB,因为 prepareForSegue 在该环境中不适用。但如果您使用的是NIB,则如下:

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

这个答案非常非常有用! - Pagorn

3

不需要使用 [self presentViewController:viewController animated:YES completion:nil];,因为转场会自动推送目标视图控制器并使用您选择的过渡效果。

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

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

但务必先从Storyboard中删除Segue。


0
在我的情况下,所有的视图控制器都是动态构建的。我不使用故事板来实现这个目的。如果您也是这种情况,您可以像下面的示例一样实例化要打开的viewController类并进行推送:
MyViewController* myViewController = [[MyViewController alloc] init];
[self.navigationController pushViewController:myViewController animated:YES];

在这种情况下,我该如何准备segue? - Konstantin
1
简单!你只需要在实例化viewController之后、调用pushViewController方法之前进行设置。例如,你可以设置一些公共属性。 - Mig70

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接