2016-11-14 130 views
1

我有一个标签栏控制器(带有底部菜单),也是一个顶部菜单。问题是我不想将黄色和绿色视图链接到标签栏(因为用户将使用顶部菜单而不是底部菜单来更改视图)。显示已经在导航堆栈上的视图控制器

我有一个问题,每次我点击按钮的视图的新实例将堆栈(所以我最终有类似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) 
    } 
} 

我可以看到的看法是对导航堆栈,因为forif语句是true。问题是,我如何检索它而不是推送同一视图的新实例? (因为除了现在这个庞大的内存问题,我也失去了我对视图的任何数据)。

我想保留堆栈中的所有内容。

实施例:

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

如果我回到V1从V4我仍然希望有V4,V3及V2导航控制器上叠加。

另一个问题是,如果这种解决方案是苹果可能拒绝的东西。

我很感激任何帮助。

enter image description here

回答

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

+0

我需要导航控制器,因为当我按下黄色和绿色的意见我还是能看到底部栏菜单。就像我说过的,我希望视图保持不变,如果我弹出,我将丢失视图上的所有数据。 – Adrian

+0

您不需要导航控制器即可查看底部的菜单栏。看看链接中的教程,你会看到:)另外,我提供的代码仅移动视图,以便这些视图控制器的“内部”状态保持不变。 – repoguy

+0

即时通讯试图说的是我不想自定义底部菜单栏,因为我已经有一个。我希望能够在导航控制器堆栈中的视图之间切换。 – Adrian

相关问题