如何从视图控制器推送 xib

Posted

技术标签:

【中文标题】如何从视图控制器推送 xib【英文标题】:How to push a xib from View Controller 【发布时间】:2016-02-11 18:19:03 【问题描述】:

我正在制作一个他们不是故事板的项目。

我对xib不太了解。

我在从 Xib 推送 ViewController 时遇到问题。

在我曾经使用的故事板中:

 [self.navigationController pushViewController......];

但是在这里我该怎么办:

我正在尝试使用此代码:

 HomeScreenVC *homeScreen = [[HomeScreenVC alloc]initWithNibName:@"HomeScreenVC" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:homeScreen];
[navController pushViewController:homeScreen animated:YES];

但它会崩溃,并且有效的代码是:

 UINavigationController *myNavigation = [[UINavigationController alloc] initWithRootViewController:self.signInVC];
[controller presentViewController:myNavigation animated:YES completion:nil];

我无法找到正确的方法。请帮忙。

【问题讨论】:

崩溃说明了什么? '不支持多次推送同一个视图控制器实例()'@Mr.T 它说,您正在尝试推送 homeVC,而 homeVC 已经在堆栈上。你现在的 VC 是什么? 我现在的VC是WelcomeVC @Mr.T 欢迎VC有导航控制器吗? 【参考方案1】:

首先尝试使用导航控制器设置视图控制器

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
//The first view controller
        self.firstController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
//The navigation controller
        UINavigationController *navController =  [[UINavigationController alloc]initWithRootViewController:self.firstController];
        [self.window addSubview:navController.view];
        self.window.rootViewController = navController;
        [self.window makeKeyAndVisible];
        return YES;

假设 ViewController 是您推送到新视图控制器的类,请尝试以下操作:

@implementation ViewController

- (void)goToHomeScreen
     HomeScreenVC *homeScreen = [[HomeScreenVC alloc]initWithNibName:@"HomeScreenVC" bundle:nil];
     [self.navigationController pushViewController:homeScreen animated:YES];

【讨论】:

不要使用与答案中发布的相同的行。将 ViewCONtroller 替换为 WelcomeScreen VC @RahulMishra【参考方案2】:

您的代码块 1 崩溃是因为:

HomeScreenVC *homeScreen = [[HomeScreenVC alloc]initWithNibName:@"HomeScreenVC" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:homeScreen];
[navController pushViewController:homeScreen animated:YES];

您已将主屏幕添加到导航控制器,并再次尝试推送同一个控制器。

你的根视图控制器(welcomeVC)没有导航控制器,所以它不能推送任何视图控制器(它只能呈现,因此第二个代码被阻止对你有用)。您必须从具有主屏幕作为根视图控制器的欢迎 VC 中呈现导航控制器。

或者

您需要在您的应用委托中将导航控制器添加为根视图控制器(在导航堆栈中有 WelcomeVC),然后通过简单地调用将 homeVC 推送到 WelcomeVC 中:

[self.navigationController pushview....

AppDelegate:在此处将导航控制器设置为根视图控制器:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

       WelcomeVC *mainViewController = [[WelcomeVC alloc]initWithNibName:@"WelcomeVC" bundle:nil]; 
       UINavigationController *navController =  [[UINavigationController alloc]initWithRootViewController: mainViewController];
        self.window.rootViewController = navController;
        [self.window makeKeyAndVisible];
        return YES;

然后推送到你想要的控制器:

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

【讨论】:

2016-02-12 00:26:09.151 MyApp[39931:821657] 警告:尝试在 上显示 ,其视图不在窗口层次结构中! 现在我收到此消息日志并出现黑屏 你在哪里调用 [self.navigationController pushViewController:homeScreen animated:YES]; ?

以上是关于如何从视图控制器推送 xib的主要内容,如果未能解决你的问题,请参考以下文章

从 xib 文件中的操作按钮推送另一个 Viewcontroller

推送控制器无法从情节提要中的嵌入式 xib 工作

如何从 xib 文件加载视图控制器?

如何关闭已呈现未推送的多个视图控制器?

如何创建从集合单元 xib 文件到集合视图控制器的出口

如何从自定义集合视图单元(使用 xib 创建的单元)到 tabBar 控制器创建自定义 segue