创建故事板中的自定义的UINavigationController没有实例化视图(Creating

2019-10-21 05:16发布

我有一个UIViewController这是在故事板创建,并已分配了一个故事板ID。 这UIViewController是在代码的不同位置实例化,并为此它没有任何意义,从各种不同的位置创建塞格斯。

视图控制器需要被包含在一个UINavigationController为了因为它使用了各种导航栏项,并且可以推额外视图控制器正常工作。

视图控制器从代码实例如下:

// some where in code that needs to present the custom view controller

UIViewController *viewControllerToPresent = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController"];

[self.viewController presentViewController: viewControllerToPresent animated:YES];

问题是,视图控制器不包含在导航控制器从故事板的预期。 我已经试过含分配UINavigationController的故事板ID的,但导致在现有代码的问题prepareForSegue其预期的实例CustomViewController

最明显的选项来解决,这将是呈现前添加一个UINavigationController的创作CustomViewController

UIViewController *viewControllerToPresent = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController: viewControllerToPresent];
[self.viewController presentViewController: nav animated:YES];

但是,这并不解决是因为从故事板的导航项不正确添加的问题。

什么对我来说似乎更合理,是有CustomViewController继承UINavigationController和建立在故事板整个事情使得自定义视图控制器都包含自己的导航栏。

我见过的类,如UIImagePickerController从继承UINavigationController ,我相信正是这种情况下,他们试图解决的问题。

问题是,当我改变CustomViewController要继承UINavigationController ,当视图控制器从故事板ID实例化,视图返回空。 其实,故事情节不建立视图的。

这是一些可以解决吗?

Answer 1:

你应该在你的故事板创建的UINavigationController并将其连接到您的UIViewController。

然后,实例化和呈现的UINavigationController:

的UINavigationController * NAV = [self.storyboard instantiateViewControllerWithIdentifier:@ “MyNavigationController”];

[self.viewController presentViewController:NAV动画:YES];

因为它是连接故事板UIViewController中会自动加载。 所有你的故事板中预先定义的按钮和配置将加载。



Answer 2:

您还没有描述你的情况很清楚。

如果你想视图控制器推到导航堆栈,你必须有屏幕上的导航控制器。

您可以设置一个故事板,其中根视图控制器的UINavigationController的自定义子类。 这工作正常。 然后,你可以使用你发布的代码实例化新的视图控制器和他们推到您的导航控制器的导航堆栈。 用于推动一个视图控制器送到导航堆栈的方法

pushViewController:animated:

然而,正在使用的呼叫,presentViewController:动画:,是提出一种模态视图控制器,而不是一个视图控制器推到导航控制器堆的方法已过时

(该方法的新版本是提出一种模态视图控制器presentViewController:animated:completion:

你的代码第二块是没有更好的:

UIViewController *viewControllerToPresent = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController: viewControllerToPresent];
[self.viewController presentViewController: nav animated:YES];

该代码创建一个导航控制器,然后忽略它,并且仍然试图呈现viewControllerToPresent作为self.viewController的顶部上的模态,无论是。

推视图控制器到导航控制器的堆栈的方法是pushViewController:动画:. 你发送消息到导航控制器,但导航控制器必须是在屏幕上,以便为它做任何事情。

以下是我建议你这样做:

选择你的故事板的初始视图控制器。 挑“嵌入>导航控制器”从编辑器的菜单。 这将创建一个新的空白导航控制器,并使其成为你的故事板的初始视图控制器。



文章来源: Creating a custom UINavigationController in storyboard isn't instantiating the view