簡體   English   中英

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

[英]Best Way to add a tabbarController in a UIviewController which have a navigation controller?

只是徘徊,我們無法在應用程序之間的uiviewcontroller中添加標簽欄控制器。 實現此類UI的最佳方式是,在應用程序中的任何控制器和其他應用程序的其他部分之間需要標簽欄,而沒有標簽欄。 我試圖在應用程序之間添加一個標簽欄控制器,但是在標簽欄項目中添加的控制器只是丟失了一些功能,例如:無法在它們上添加按鈕,而且它們沒有顯示正在存在的導航欄標題添加到標簽欄控制器上。

我們如何解決這個問題。 在應用程序中間實現標簽欄控制器的最佳方式。

我曾經在類似的應用程序,即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

祝好運 :)

請使用導航控制器和工具欄來實現此功能。

在xp_AppDelegate.h中添加

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

在xp_AppDelegate.m中

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

創建UIController類別添加工​​具欄的位置。

在視圖控制器中,您可以包含類別以調用在導航欄上繪制工具欄的功能。

這是好的一部分。 您可以在每個視圖控制器的選項卡數量上擁有良好的控制器。

請讓我知道你的理解,否則我會把工作的虛擬代碼。

是的,在創建了大量的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將正常運行,我們已經實現了我們想要做的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM