iOS - 推送到不在情节提要中的视图控制器

iOS - Pushing to a View Controller that is not in the Storyboard

好的,首先我们来命名:

我的根视图控制器中有一个 table 视图,我们称之为 "HomeViewController"。在 table 视图中,每个单元格点击都会推送不同的视图控制器。我们称之为 "DetailViewControllers".

的视图控制器集合

我非常清楚,我可以通过在 didSelectRowAtIndexPath 方法中以编程方式简单地加载和推送每个 DetailViewController 来完成这项工作。我想做一些不同的事情,而不是使用故事板和原型单元,但我没有成功,所以我正在寻找一些建议,因为我不太精通故事板和 segues。

我在这里试图实现的行为是: 我将从我的 HomeViewController 中 table 视图中的原型单元格中获取一个 segue。该 segue 推送一个 "base" 视图控制器,每个 DetailViewController 都继承自该视图控制器。这些视图控制器在情节提要中也没有分配的视图控制器。

在 prepareForSegue 方法中,我想将 'destinationViewController' 转换为 'right' class。该应用程序此时崩溃并显示 "Could not cast value of type 'BaseTestViewController' to 'TestViewController'."。这完全可以理解。

所以,我的问题是:有没有办法让 segue 像那样工作?

在没有故事板转场的情况下像这样尝试。

let objDestVC = self.storyboard.instantiateViewControllerWithIdentifier("DestVCStroyboardId") as! DestinationViewController
self.navigationController?.pushViewController(objDestVC, animated: true)

您不能以编程方式创建转场。没有情节提要,就不会存在 Segues。您可以通过加载 nib 文件推送到视图控制器。

这是您的操作方法。

假设您有一个 nib 文件,其中包含视图控制器主视图的视图布局。例如,我们将其命名为 "Test"。

  1. 转到该 nib 文件,单击文件所有者。

  2. 将 class 更改为您的视图控制器的名称。就我而言,我将其命名为 ViewController.

  1. 右键单击文件所有者。 Link 你的视图控制器的视图出口到 nib 文件中的视图。

  2. 然后在你想转换到那个视图控制器的视图控制器中,你这样做:

    UIViewController *controller = [[UIViewController alloc] initWithNibName:@"Test" bundle:[NSBundle mainBundle]];

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

它将以模态方式呈现视图控制器。

如果您要嵌入导航控制器,那么您可以这样做:

[self.navigationController pushViewController:controller animated:YES];

希望对您有所帮助。