【问题标题】:push to another view controller without prepareForSegue在没有 prepareForSegue 的情况下推送到另一个视图控制器
【发布时间】:2013-03-12 20:58:52
【问题描述】:

如果没有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];        
}

【问题讨论】:

    标签: ios objective-c uiviewcontroller uistoryboardsegue pushviewcontroller


    【解决方案1】:

    如果您想以编程方式调用推送转场,请在 Interface Builder 中为转场提供“故事板 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];
    

    【讨论】:

    • 这个答案非常非常有用!
    【解决方案2】:

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

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

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

    但请确保先删除情节提要中的转场。

    【讨论】:

      【解决方案3】:
         NSString * storyboardName = @"Main";
          UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
          UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewControllerID"];
          [self presentViewController:vc animated:YES completion:nil];
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 在这种情况下我该如何准备segue?
        • 简单!您只需在 viewController 实例化之后和调用 pushViewController 方法之前执行此操作。例如,您可以设置 viewController 的一些公共属性。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-11
        • 1970-01-01
        • 2016-09-13
        • 1970-01-01
        • 1970-01-01
        • 2015-10-21
        • 1970-01-01
        相关资源
        最近更新 更多