Iphone 在具有导航控制器的UIviewController中添加tabbarController的最佳方法?

Iphone 在具有导航控制器的UIviewController中添加tabbarController的最佳方法?,iphone,ios5,tabbar,navigationbar,Iphone,Ios5,Tabbar,Navigationbar,只是想知道我们不能在应用程序中间的uiviewcontroller中添加选项卡栏控制器。实现这种UI的最佳方法是什么?在这种UI中,应用程序中的任何控制器和其他应用程序的其余部分之间都需要选项卡栏,而没有选项卡栏。我试图在应用程序的中间添加一个选项卡栏控制器,但正在选项卡栏项目中添加的控制器丢失了一些功能,例如:无法在它们上添加按钮,并且它们没有显示正在选项卡栏控制器上添加的导航栏标题 -(void)removeTabbar { [navcontroller popToRootViewContr

只是想知道我们不能在应用程序中间的uiviewcontroller中添加选项卡栏控制器。实现这种UI的最佳方法是什么?在这种UI中,应用程序中的任何控制器和其他应用程序的其余部分之间都需要选项卡栏,而没有选项卡栏。我试图在应用程序的中间添加一个选项卡栏控制器,但正在选项卡栏项目中添加的控制器丢失了一些功能,例如:无法在它们上添加按钮,并且它们没有显示正在选项卡栏控制器上添加的导航栏标题

-(void)removeTabbar
{
[navcontroller popToRootViewControllerAnimated:YES];

我们怎样才能解决这个问题。在应用程序中间实现选项卡栏控制器的最佳方法

我也开发过类似的应用程序I-e。此应用程序的流程如下所示:

ECSlidingViewConroller-->UINavigationController-->带有选项卡的自定义容器UIViewController-->UIViewController

import UIKit

class CustomTabbarControllerViewController: UIViewController, UITabBarDelegate {

  var storyboardIDs:[String] = ["FavouritesController","MoreController"]
  var viewControllers:[UIViewController] = []
  var activeController:UIViewController? = nil

  @IBOutlet weak var childView: UIView!
  @IBOutlet weak var tabbar: UITabBar!

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    //We have created child to just use its from on different screen(s) i-e iPhone4/5/6/6+ or iPad without changing any code, So its hidden now
    self.childView.hidden = true

    for storyboardID in self.storyboardIDs {
      var controller = self.storyboard?.instantiateViewControllerWithIdentifier(storyboardID) as UIViewController
      viewControllers.append(controller)
    }

    self.tabbar.delegate = self
    var firstItem = self.tabbar.items?[0] as UITabBarItem!
    self.tabbar.selectedItem = firstItem
    self.tabBar(tabbar, didSelectItem: firstItem)
  }

  func displayContentController(contentController:UIViewController) {
    self.addChildViewController(contentController)
    contentController.view.frame = self.childView.frame
    self.view.addSubview(contentController.view)
    contentController .didMoveToParentViewController(self)
    self.activeController = contentController
  }

  func hideContentController(contentController:UIViewController) {
    contentController.willMoveToParentViewController(nil)
    contentController.view .removeFromSuperview()
    contentController.removeFromParentViewController()
  }

  func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem!) {
    if let tempActiveController = activeController {
      self.hideContentController(tempActiveController)
    }
    switch item.tag {
    case 0: //Favourites
      self.displayContentController(viewControllers[0])
    case 1: //More
      self.displayContentController(viewControllers[1])
    default:
      break;
    }
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }
}
所以你可以有这样的层次结构: UINavigationController-->带有选项卡的自定义容器UIViewController-->UIViewController

import UIKit

class CustomTabbarControllerViewController: UIViewController, UITabBarDelegate {

  var storyboardIDs:[String] = ["FavouritesController","MoreController"]
  var viewControllers:[UIViewController] = []
  var activeController:UIViewController? = nil

  @IBOutlet weak var childView: UIView!
  @IBOutlet weak var tabbar: UITabBar!

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    //We have created child to just use its from on different screen(s) i-e iPhone4/5/6/6+ or iPad without changing any code, So its hidden now
    self.childView.hidden = true

    for storyboardID in self.storyboardIDs {
      var controller = self.storyboard?.instantiateViewControllerWithIdentifier(storyboardID) as UIViewController
      viewControllers.append(controller)
    }

    self.tabbar.delegate = self
    var firstItem = self.tabbar.items?[0] as UITabBarItem!
    self.tabbar.selectedItem = firstItem
    self.tabBar(tabbar, didSelectItem: firstItem)
  }

  func displayContentController(contentController:UIViewController) {
    self.addChildViewController(contentController)
    contentController.view.frame = self.childView.frame
    self.view.addSubview(contentController.view)
    contentController .didMoveToParentViewController(self)
    self.activeController = contentController
  }

  func hideContentController(contentController:UIViewController) {
    contentController.willMoveToParentViewController(nil)
    contentController.view .removeFromSuperview()
    contentController.removeFromParentViewController()
  }

  func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem!) {
    if let tempActiveController = activeController {
      self.hideContentController(tempActiveController)
    }
    switch item.tag {
    case 0: //Favourites
      self.displayContentController(viewControllers[0])
    case 1: //More
      self.displayContentController(viewControllers[1])
    default:
      break;
    }
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }
}
下载示例代码:


祝你好运:)

请使用导航控制器和工具栏使其正常工作

在xp_AppDelegate.h中添加

@属性(强,非原子)UINavigationController*appNavController

在xp_AppDelegate.m中

_appNavController=[[UINavigationController alloc]initWithRootViewController:yourrootviewcontroller]

创建要添加工具栏的UIController类别

在视图控制器中,您可以包含要调用函数的类别,该函数用于在导航栏上打印工具栏

好的方面是。在每个视图控制器的选项卡数量上,您拥有良好的控制器


请让我知道你的理解,否则我会把工作的虚拟代码。

是的,我在创建了大量POC后得到了答案。我们如何通过编程实现它

不需要使用任何子类化或工具栏。在委托类中编写一个函数,在其中创建选项卡栏并将根视图控制器添加到导航控制器

-(void)removeTabbar
{
[navcontroller popToRootViewControllerAnimated:YES];
这将像下面这样工作

当您使用导航控制器启动第一个视图控制器时,您将执行以下操作
[self.window setRootViewController:navcontroller]

创建视图控制器后,可以创建一个函数,在其中创建选项卡栏及其视图控制器。这看起来像下面的代码

-(void)CreateTabar {

}

一旦您将从共享代理中调用它,就会添加对象选项卡栏,并且当您想要删除它时。您只需要创建一个功能,在其中可以从导航控制器中删除子视图

-(void)removeTabbar
{
[navcontroller popToRootViewControllerAnimated:YES];
}


现在已经完成,您的UI将正常运行,我们已经实现了我们想要做的

您使用的是哪种接口类型?…如“故事板”/“xib”/…等。我通过编码来实现,不使用任何故事板/xib。我尝试了它们中的每一种,但它们的行为都相同。实际上,添加它们的流程是。。Tabbar控制器-->导航控制器-->视图控制器。是的,我在文档中读到过,但大多数应用程序都会启动选项卡栏,其中一些应用程序(如登录和注册屏幕)没有选项卡栏,一旦用户登录,就会出现带有UI控件平滑过渡的选项卡栏。我试图在delegate类上创建一个类别,其中我创建了一个函数来添加tab bar控制器,但在tab bar添加任何提示或帮助后,我失去了对上一个控制器的控制?可能对您有帮助,也许您正在寻找它?[单击此处][1][1]:是的,如果您可以共享代码iMemon:)@Ballu我已经在swift/XCode6.1中创建了一个示例。检查它,让我知道你是否需要一些moe帮助:)我想使用选项卡栏控制器而不是工具栏,请仔细阅读问题。