0

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

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''

我在谷歌上做了很多搜索,并通过文档寻找解决方案,我拥有的壁橱(至少我认为)就是这个问题。解释和解决方案听起来可能是正确且相关的,但我无法将它们付诸实践。

我阅读并尝试过的文件:

initWithRootViewController

popToRootViewController - 当前的根视图控制器用于选项卡栏 - 不是我需要的登录场景,据我所知我不能使用它。

弹出视图控件

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

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

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

谢谢

JA

编辑 - 故事板的缩小图像

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

4

1 回答 1

1

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

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

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


原答案:

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

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

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

UIViewController *controller = [self.storyboard instantiateInitialViewController];

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

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

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

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

如果登录是您应用程序中的初始场景,并且您一直在做推送转场(一路上没有模态转场),您可以执行以下操作:

[self.navigationController popToRootViewControllerAnimated:YES]; 

这将带你到顶层视图控制器,它会弹出并释放所有介入的场景。

如果您使用的是 iOS 6,您可以使用 unwind segue,它可以实现相同的功能,但它并不关心前面的 segue 是 push 还是 modals。

给猫剥皮的方法有很多种,但通常presentViewController对故事板中的第一个场景进行新的处理是一个非常糟糕的主意。

于 2013-04-24T12:00:47.963 回答