显示已在导航堆栈上的视图控制器

时间:2016-11-14 16:23:45

标签: ios swift3 navigationcontroller

我有一个标签栏控制器(带有底部菜单)和一个顶级菜单。问题是我不想将黄色和绿色视图链接到标签栏(因为用户将使用顶部菜单而不是底部菜单更改视图)。

我遇到的问题是,每次点击按钮时,视图的新实例都会堆叠(所以我最终会得到类似V1的信息 - > V2 - > V3 - > V2 - > V4等等)

我的部分解决方案是制作这样的东西:

@IBAction func yellowViewButtonAction(_ sender: AnyObject)
{
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let controller = storyboard.instantiateViewController(withIdentifier: "YelloViewController") as! YelloViewController

    if let viewControllers = navigationController?.viewControllers {
        for viewController in viewControllers {
            // some process
            if viewController is YelloViewController {
                print("View is on stack")
            }
        } 

         let storyboard = UIStoryboard(name: "Main", bundle: nil)
         let controller = storyboard.instantiateViewController(withIdentifier: "YelloViewController") as! YelloViewController
         self.navigationController?.pushViewController(controller, animated: false)
    }
}

我可以看到视图位于导航堆栈上,因为if中的for语句是true。问题是,如何检索它而不是推送同一视图的新实例? (因为除了存在的巨大内存问题,我还丢失了我在视图上的任何数据。)

我想保持堆栈中的所有内容完整。

示例:

V1 - > V2 - > V3 - > V4(当前视图)

如果我从V4回到V1,我仍然想在导航控制器堆栈上安装V4,V3和V2。

另一个问题是,如果这个解决方案是Apple可能会拒绝的。

我感谢任何帮助。

enter image description here

2 个答案:

答案 0 :(得分:1)

看起来你不使用并需要导航控制器。每当你调用self.navigationController?.pushViewController(controller, animated: false)时,该控制器的新实例即将进行堆叠。

理想情况下,您可以从已导航的视图控制器调用popViewController。在创建标签栏控制器的自定义行为时,很难完全按照您的计划获得导航逻辑,至少在我看来是这样。

在这种情况下,我通常会手动显示和隐藏视图控制器。

@IBAction func didPressTab(sender: UIButton) {
        let previousIndex = selectedIndex
        selectedIndex = sender.tag
        buttons[previousIndex].selected = false
        let previousVC = viewControllers[previousIndex]
        previousVC.willMoveToParentViewController(nil)
        previousVC.view.removeFromSuperview()
        previousVC.removeFromParentViewController()
        sender.selected = true
        let vc = viewControllers[selectedIndex]
        addChildViewController(vc)
        vc.view.frame = contentView.bounds
        contentView.addSubview(vc.view)
        vc.didMoveToParentViewController(self)

    }

其中每个'导航按钮'都有唯一的id并调用didPressTab函数。

我实际上是从本教程中学到的:https://github.com/codepath/ios_guides/wiki/Creating-a-Custom-Tab-Bar

答案 1 :(得分:0)

弹出视图控制器,直到指定的视图控制器位于导航堆栈的顶部。

参考-https://developer.apple.com/documentation/uikit/uinavigationcontroller

func popToViewController(UIViewController, animated: Bool) -> [UIViewController]?