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

时间:2014-11-12 05:07:27

标签: iphone ios5 tabbar navigationbar

只是徘徊,我们无法在应用程序之间的uiviewcontroller中添加标签栏控制器。实现此类UI的最佳方式是,在应用程序中的任何控制器和其他应用程序的其他部分之间需要标签栏,而没有标签栏。我试图在应用程序之间添加一个标签栏控制器,但是在标签栏项目中添加的控制器只丢失了一些功能,例如:无法在它们上添加按钮,并且它们没有显示正在存在的导航栏标题添加到标签栏控制器上。

我们如何解决这个问题。在应用程序中间实现标签栏控制器的最佳方式。

3 个答案:

答案 0 :(得分:4)

我参与了类似的应用程序i-e Kubuto。这个应用程序的流程是这样的:

ECSlidingViewConroller - > UINavigationController - >带TabBar的自定义容器UIViewController - >的UIViewController

所以你可以拥有这样的层次结构: UINavigationController - >带TabBar的自定义容器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.
  }
}

下载示例代码:https://www.dropbox.com/sh/fk84lxg7ns1wp3p/AACUrYQl6jI7WQ_GTp9kWj_6a?dl=0

祝你好运:)

答案 1 :(得分:0)

请使用导航控制器和工具栏来实现此功能。

在xp_AppDelegate.h中添加

@property(强,非原子)UINavigationController * appNavController;

xp_AppDelegate.m中的

_appNavController = [[UINavigationController alloc] initWithRootViewController:yourrootviewcontroller];

创建UIController类别添加工​​具栏的位置。

在视图控制器中,您可以包含类别以调用导航栏上绘制工具栏的功能。

这是好的部分。对于每个视图控制器,您都有很好的控制器数量。

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

答案 2 :(得分:0)

是的,在创建了大量POC后,我得到了答案。我们如何通过编程方式来做到这一点。

无需使用任何子类或工具栏。在委托类中编写一个函数,在该类中创建标签栏并将根视图控制器添加到导航控制器。

这将以下面的方式工作。

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

创建视图控制器后,您可以创建一个功能,您可以在其中创建标签栏及其视图控制器。这看起来像下面的代码。

- (无效)createTabbar {

UITabBarItem *tabBarItem1 = [tabBarCntrl.tabBar.items objectAtIndex:0];
tabBarItem1.title = @"First";
UITabBarItem *tabBarItem2 = [tabBarCntrl.tabBar.items objectAtIndex:1];
tabBarItem2.title = @"Second";


SecondViewController *viewController3 = [[SecondViewController alloc] init] ;
UINavigationController *nc2;
nc2 = [[UINavigationController alloc] initWithRootViewController:viewController3];



tabBarCntrl = [[UITabBarController alloc]init];
tabBarCntrl.viewControllers = [NSArray arrayWithObjects: nc2,nil];
[navcontroller pushViewController:tabBarCntrl animated:YES];

}

一旦您从共享委托对象中调用它,将添加标签栏,并在您想要删除它时。你只需要创建一个功能,你可以从导航控制器中删除子视图。

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

}

现在它完成了你的UI将正常运行,我们已经实现了我们想要做的事情。