使用情节提要时切换 UIViewController
Posted
技术标签:
【中文标题】使用情节提要时切换 UIViewController【英文标题】:switching UIViewController while using storyboard 【发布时间】:2014-05-11 21:35:58 【问题描述】:我正在为 iPhone 开发一个应用程序。我的问题是,我有一个类似于快捷菜单的 uiviewcontroller。从那里,我希望能够将页面切换到情节提要上的任何页面,但只是像这样呈现它
[self.mainID dismissViewControllerAnimated:YES
completion:^
checkin_vc *sampleView = [[checkin_vc alloc] init];
[self.mainID presentViewController:sampleView animated:YES completion:nil];
];
似乎没有削减它。什么都没有发生,如果我尝试在不首先关闭当前控制器的情况下呈现它,那么我会得到一个黑屏,很可能是因为我试图呈现一个类对象,而不是在情节提要上设置的实际视图控制器.
我试过了
[self.mainID dismissViewControllerAnimated:YES
completion:^
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
checkin_vc *sampleVIew = (checkin_vc *)[mainStoryboard instantiateViewControllerWithIdentifier:@"checkin_sid"];
[self.mainID presentViewController:sampleVIew animated:YES completion:nil];
];
dismiss 完成,我返回到之前的视图控制器,但完成部分永远不会完成。
我也收到此警告:
2014-05-12 00:05:31.388 Roborder[5503:60b] 警告:尝试呈现不在窗口层次结构中的视图!
【问题讨论】:
只是 -(id)initMe: (id)mainc segue:(NSString*)seg self = [super initWithFrame:CGRectMake(0, 0, 0, 0)]; self.seg = 段; self.mainID = mainc;回归自我;传递的是我想在那里使用的视图控制器的“自我”。 好的,这个“self.mainID dismissViewControllerAnimated”你关闭了视图控制器,然后你试图用这个“[self.mainID presentViewController]”在上面显示视图控制器,所以这里没有得到self.mainId 你能解释一下你的要求吗? 更改 [self.mainID presentViewController:sampleVIew animated:YES completion:nil]; with [self presentViewController:sampleVIew animated:YES completion:nil];我认为这将解决您当前的问题 问题是,我调用它的类不是视图控制器。只适合我的快捷方式菜单的控制器。这就是我将当前视图控制器传递给它的原因 【参考方案1】:我对情节提要的经验是,通过 alloc init 进行实例化是行不通的。首先确保您可能调用的每个视图控制器在情节提要中都有一个情节提要集。它只是一个唯一的字符串,但您可以如下使用它来实例化:
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
checkin_vc *sampleVIew = (checkin_vc *)[mainStoryboard instantiateViewControllerWithIdentifier:@"checkin_vc"];
//present as original code.
虽然已经晚了,所以如果我误解了这个问题,请告诉我:)
【讨论】:
你的问题是对的。我试过了,现在我得到警告:尝试在Cocoadelica 的代码是正确的,但是你需要在 storyboard 中给你的 checkin_vc 一个 Identifier 来展示它——检查左侧面板——显示身份检查器——在“Storyboard ID”中输入一个字符串(例如:checkin view控制器)--然后你可以像这样在代码中使用它
checkin_vc *sampleVIew = (checkin_vc *)[mainStoryboard instantiateViewControllerWithIdentifier:@"checkin view controller"];
你不应该关闭快捷菜单(如果它是你的根菜单),因为你正在 checkin_vc 将失去它的父级(viewcontroller)。
这是我的viewcontroller切换示例代码,希望对你有所帮助:
在 MenuViewController.m 中
-(IBAction)GotoShop:(id)sender
ShopViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"ShopController"];
[self presentViewController:viewController animated:YES completion:nil];
这将显示 shopViewController
在 ShopViewController.m 中
-(IBAction)QuitShop:(id)sender
[self dismissViewControllerAnimated:YES completion:nil];
这将关闭 shopViewController 并返回它的 parentviewcontroller --- 在这种情况下返回 MenuViewController
【讨论】:
感谢您的回答,我正试图解决这个问题。但是你暗示了一个问题,当我发布个人资料页面 vc 时,它是我试图从中呈现 checkinvc 的类的父级,我的完成块无法执行,因为它是与它一起发布的,或者是吗?嗯,我对 ios 很陌生 :) 我的建议是放慢一点速度,阅读 Cocoa 编程指南和 View Controller 编程指南,你就会明白了。 @Hypnotick 好吧,我想你可能误解了 vc 结构。当你启动一个应用程序时,你总是有一个入口点——这是应用程序的根vc,这个入口点vc永远不会被关闭,如果它被关闭,应用程序将崩溃(或退出?)。如果您的个人资料页面 vc 不是根 vc ,请不要在个人资料页面 vc 中显示 checkinvc,而是在个人资料页面的 parentvc 中显示 checkinvc。 我浏览了一些教程,看到了你在高翼发布的内容,它解决了问题:D 无论如何谢谢!以上是关于使用情节提要时切换 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章