我使用下面的代码返回登录视图。视图正确加载,一切看起来都很好。所有按钮都有效。
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。解释和解决方案听起来可能是正确和相关的,但我不能将它们付诸实践。
我读过并试过的文件:
popToRootViewController - 当前的根视图控制器用于标签栏 - 而不是我需要的登录场景,据我知道我不能使用它。
pushViewControl - 这有效,我不认为这是正确的方法。我不希望有导航栏,当用户返回登录场景时,我不希望我的标签栏出现。
我尝试了各种有限/无效的方法。在这个阶段,任何帮助将不胜感激。
如果我没有提供足够的信息,请告诉我。
由于
JA
编辑 - 缩小故事板的图像
![缩小故事板的图像] [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
是一个非常糟糕的主意。