【问题标题】:Best Way to add a tabbarController in a UIviewController which have a navigation controller?在具有导航控制器的 UIviewController 中添加 tabbarController 的最佳方法?
【发布时间】:2015-01-08 20:59:05
【问题描述】:

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

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

【问题讨论】:

  • 您使用的是哪种界面类型?....比如“StoryBoard”/“xib”/....等
  • 我是通过编码而不是使用任何storyBoard/xib来实现的,我尝试了它们中的每一个,但它们的行为都是一样的。
  • 其实添加它们的流程是.. Tabbarcontroller--> Navigation Controller -->ViewController.
  • 是的,我在文档中读到了这一点,但是大多数应用程序在登录和注册屏幕之间的某个位置启动标签栏,没有标签栏,一旦用户登录,它就会出现流畅的标签栏UI控件的过渡。我尝试在委托类上创建一个类别,在其中我创建了一个函数来添加标签栏控制器,但是一旦标签栏添加了任何提示或帮助,我就失去了对最后一个控制器的控制?
  • 可能对您有帮助,也许您正在寻找它? [点击这里][1] [1]:stackoverflow.com/questions/14015122/…

标签: iphone ios5 tabbar navigationbar


【解决方案1】:

是的,在创建大量 POC 以完成此任务后,我得到了答案。我们如何以编程方式做到这一点。

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

这将像以下方式一样工作。

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

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

-(void)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 将正常运行,我们已经实现了我们想要做的事情。

【讨论】:

    【解决方案2】:

    请使用导航控制器和工具栏来完成这项工作。

    在 xp_AppDelegate.h 中添加

    @property (strong, nonatomic) UINavigationController *appNavController;

    在 xp_AppDelegate.m 中

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

    创建用于添加工具栏的 UIController 类别。

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

    这是好的部分。您可以很好地控制每个视图控制器的选项卡数量。

    请让我知道您的理解,否则我将放置工作虚拟代码。

    【讨论】:

    • 我想使用标签栏控制器而不是工具栏,请仔细阅读问题。
    【解决方案3】:

    我曾开发过类似的应用程序,即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

    祝你好运:)

    【讨论】:

    • 是的,如果你能分享代码 iMemon 将会非常有帮助:)
    • @Ballu 我在 swift/XCode6.1 中创建了一个示例。检查一下,如果您需要一些帮助,请告诉我:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    相关资源
    最近更新 更多