ios - 程序在 PerformSegueWithIdentifier 中断以进行推送转场

标签 ios objective-c segue uistoryboardsegue

我有一个登录 View 。如果登录成功,我想要我的程序,导航到主窗口。

我在登录 View 和主视图之间使用了模态转场。

但是,在到达主视图后,我想使用 push segues,不幸的是我遇到了以下异常:

Terminating app due to uncaught exception 'NSGenericException', reason: 
'Could not find a navigation controller for segue 'routeList'. 
Push segues can only be used when the source controller is managed by an 
instance of UINavigationController.'

这是我在“登录 Controller ”中为“模态转场”提供的命令的功能:

//LoginController.m
- (IBAction)loginTapped:(id)sender {
     [self performSegueWithIdentifier:@"login" sender:@{@"foo": @"bar"}];
}

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if ([[segue identifier] isEqualToString:@"login"])
    {
        MainController *vc = segue.destinationViewController;
        vc.uuid = userUuid;
    }
}

以下是我用来在“主 Controller ”中执行“push segue”的函数。我想在这里执行 push segue,但我在这部分遇到了异常。

//MainController.m
- (IBAction)actionGo:(id)sender {
     [self performSegueWithIdentifier:@"routeList" sender:self];
}

事实上,我在“登录 View ”之前有一个导航 Controller 。那么为什么它找不到“导航 Controller ”呢?

如果我使用模态转场,它就可以工作。那么为什么它不适用于 push segue 呢?

编辑 1 - 我的 Storyboard:

enter image description here

编辑 2 - 建议将主 Controller 嵌入到导航 Controller 中(单击 routeList segue 的源 Controller ,然后在编辑器菜单下选择嵌入 > 导航 Controller )。现在,我的 Storyboard如下所示,我现在正面临这个错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '-[UINavigationController setUuid:]: unrecognized selector sent to 
instance 0x17da9df0'

我正在将值从登录 Controller 传递到主 Controller 。当我添加一个导航 Controller 时,我无法传递这个值。我怎样才能传递这个值?

MainController 嵌入到导航 Controller 时的 Storyboard: enter image description here

我的话解决方案:

感谢在此线程中分享他们答案的人 :) 我解决了这个问题。在导航 Controller 堆栈中, 如果我放置一个模态 segue,链接会以某种方式断开,其余 View 不属于导航 Controller 。所以,我把所有的segues都做成了“push style”。然后在 MainController.m 我删除了后退按钮,如下所示:

-(void)viewDidAppear:(BOOL)animated{
    [self.navigationItem setHidesBackButton:YES animated:NO];
} 

最佳答案

它不起作用,因为您正在从一个 Controller 中触发 routeList segue,该 Controller 以模态方式呈现且不包含在导航 Controller 中。

您可能想要交换层次结构,以便主视图位于作为窗口 Root View Controller 的导航 Controller 中,并且登录屏幕以模态方式呈现(并在登录完成时关闭)。


从不同的东西开始:删除所有模态转场并让它们推送。接下来,在主视图 Controller 中,实现 viewDidAppear: 以获取导航 Controller 并将其 View Controller 设置为 @[ self ](这将删除登录 View Controller ) .这应该可以解决您的紧迫问题。

关于ios - 程序在 PerformSegueWithIdentifier 中断以进行推送转场,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20124439/

相关文章:

json - 执行segue swift 4

iphone - UIToolBar 的 View 转换动画不正确

xcode - PrepareForSegue Swift(更改 UIImage 和 UILabel)

ios - 在设备方向改变时交叉淡入淡出某些 UIView

ios - 以编程方式将键盘从大写切换为小写

ios - 不使用 Storyboard 的 SlideMenu Like Facebook

objective-c - 如何将参数传递给基于 Phonegap 构建的应用程序

ios - 对 segue 源 View Controller 的引用

ios - UITableViewController 显示人员信息 - 需要编辑帮助

javascript - UIWebView 中的 Web Audio API 停止音乐应用程序的当前歌曲