Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 制作新的UINavigationController,然后通过编程清空旧导航控制器的堆栈_Ios_Swift_Uinavigationcontroller - Fatal编程技术网

Ios 制作新的UINavigationController,然后通过编程清空旧导航控制器的堆栈

Ios 制作新的UINavigationController,然后通过编程清空旧导航控制器的堆栈,ios,swift,uinavigationcontroller,Ios,Swift,Uinavigationcontroller,如果不使用故事板,我想: 在app委托中创建一个UINavigationController(我们称之为NC_a),然后将一组uiviewcontroller推到它上面。(这不需要解释。这只是第一步。) 然后,从堆栈上的最后一个UIViewController,我想跳转到一个新的UINavigationController(NC_B) 显示新NC_B的根视图后,NC_A上的后台将弹出回NC_A的根视图,这样当我返回时,将显示根视图 首先,准备NC\u A: let rootA = UIViewC

如果不使用故事板,我想:

  • 在app委托中创建一个UINavigationController(我们称之为NC_a),然后将一组uiviewcontroller推到它上面。(这不需要解释。这只是第一步。)

  • 然后,从堆栈上的最后一个UIViewController,我想跳转到一个新的UINavigationController(NC_B)

  • 显示新NC_B的根视图后,NC_A上的后台将弹出回NC_A的根视图,这样当我返回时,将显示根视图


  • 首先,准备
    NC\u A

    let rootA = UIViewController(...)
    let navA = UINavigationController(rootViewController: rootA)
    
    navA
    应该是窗口的根视图控制器,或者以其他方式显示。在
    navA
    上推送一组视图控制器

    现在准备
    NC\u B
    。我们将在您的
    NC_A
    堆栈顶部以模式呈现它。我们可以使用
    presentViewControllerAnimated
    上的完成处理程序将
    NC\u A
    弹出回其根视图控制器

    let rootB = UIViewController(...)
    
    let navB = UINavigationController(rootViewController: rootB)
    
    navA.presentViewController(navB, animated: true) { () -> Void in
        navA.popToRootViewControllerAnimated(true)
    }
    

    现在,当您在
    NC_B
    上调用
    dismissViewControllerAnimated
    时,
    NC_A
    将弹出到它的根视图控制器。

    这里是objective-c解决方案:您可以将NC_A和NC_B导航控制器都放在主导航控制器中,并让它来处理切换

    let rootB = UIViewController(...)
    
    let navB = UINavigationController(rootViewController: rootB)
    
    navA.presentViewController(navB, animated: true) { () -> Void in
        navA.popToRootViewControllerAnimated(true)
    }
    
    1。设置:

    UIViewController * rootVC_A = [[UIViewController alloc]init];
    UINavigationController * NC_A = [[UINavigationController alloc]initWithRootViewController: rootVC_A];
    
    UIViewController * rootVC_B = [[UIViewController alloc]init];
    UINavigationController * NC_B = [[UINavigationController alloc]initWithRootViewController: rootVC_B];
    
    UINavigationController * RootNavigationController = [[UINavigationController alloc]initWithRootViewController: NC_A];
    
    2.推送至NC\U A

    for(int i = 0; i < 5; i ++)
    {
        UIViewController * randomVC = [[UIViewController alloc]init];
        [NC_A pushViewController:randomVC animated: true];
    }
    
    4。弹回NC_A

    [NC_A popToRootViewController];
    

    这个问题被标记为Swift,为什么你会发布Objective-C解决方案?当我在Mac上时,我可以将这个解决方案转换为Swift,想法完全相同,所以我只发布了Objective-C,我更喜欢的是,我不认为将您的答案翻译成Swift会增加我之前的答案中未包含的内容(Swift中已有)。您的解决方案是以模式呈现第二个导航控制器,而我的解决方案是将其包装在顶部导航控制器上?我个人认为,在主导航控制器中包装这两个导航控制器是一个更健壮的解决方案,因为它允许您以相同的方式对第三和第四导航控制器执行相同的操作,如果他以后需要的话。。。