使用presentViewController后,现有的segues无法找到

时间:2013-04-24 11:51:39

标签: ios objective-c uiviewcontroller segue

我使用下面的代码返回登录视图。视图正确加载,一切看起来都很好。所有按钮都有效。

JALoginViewController *loginVC = [[JALoginViewController alloc] init];

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:loginVC];

navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
[self.navigationController presentModalViewController:navigationController animated:YES];

但是,如果用户尝试再次登录,则无法找到将他们带到下一个场景的segue。

如果用户登录凭据正确,我正在使用performSegueWithIdentifier,如下所示:

[self performSegueWithIdentifier:@"loginSegue" sender:self];

这是我收到的错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (<JALoginViewController: 0x8d614b0>) has no segue with identifier 'loginSegue''

我已经在Google上进行了大量搜索,并通过文档解决了这个问题,我得到的壁橱(至少我认为)是this question。解释和解决方案听起来可能是正确和相关的,但我不能将它们付诸实践。

我读过并试过的文件:

initWithRootViewController

popToRootViewController - 当前的根视图控制器用于标签栏 - 而不是我需要的登录场景,据我知道我不能使用它。

popViewControl

pushViewControl - 这有效,我不认为这是正确的方法。我不希望有导航栏,当用户返回登录场景时,我不希望我的标签栏出现。

我尝试了各种有限/无效的方法。在这个阶段,任何帮助将不胜感激。

如果我没有提供足够的信息,请告诉我。

由于

JA

编辑 - 缩小故事板的图像

![缩小故事板的图像] [1]

1 个答案:

答案 0 :(得分:1)

根据修订后问题的屏幕快照,从最右边的红色突出显示的场景,您应该能够:

[self.tabBarController dismissViewControllerAnimated:YES completion:nil]; 

你会回到那个初始屏幕(我假设你从初始屏幕到你的标签栏控制器进行了模态调整)。


原始答案:

如果您想手动推送到视图控制器,而不是通过alloc / init创建它,则应使用

UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"loginsSceneStoryboardIdHere"];

或者,如果该视图控制器是“初始”场景(从左侧进入简单箭头的场景),则可以使用

UIViewController *controller = [self.storyboard instantiateInitialViewController];

您也不应该手动创建导航控制器。如果loginVC需要导航控制器,您应该将该场景嵌入到界面生成器中的导航控制器中,然后为该新导航控制器提供其自己唯一的故事板标识符,然后您可以

UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"navControllerSceneStoryboardIdHere"];

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

我必须承认,我担心整个“通过pushViewController返回登录”构造。我假设你知道你没有“回归”它,而是创建它的新副本。如果你将/ modal从A推到B然后B到C然后从C推到A,你将4个视图及其控制器保存在内存中,两个副本A和一个B和一个C(显然,不好)。我只是想确保你没有一组循环的segues和/或push / presentViewController引用。

如果登录是您应用中的初始场景,并且您一直只做推送segues(沿途没有模态段),您可以执行以下操作:

[self.navigationController popToRootViewControllerAnimated:YES]; 

这将带您进入顶级视图控制器,它将弹出并释放所有插入的场景。

如果您正在使用iOS 6,您可以利用unwind segue,它可以实现相同的功能,但它并不关心前面的segues是推送还是模态。

有很多方法可以让猫皮肤化,但通常会在故事板中为第一个场景做一个新的presentViewController是一个非常糟糕的主意。