天天看點

iOS三級控制器的4種建立方法

三級控制器:視圖控制器(UIViewController),導航控制器(UINavigationController),标簽控制器(UITabBarController)

三者的關系是:标簽控制器(UITabBarController)管理(一個或多個)導航控制器(UINavigationController),每個導航控制器管理一個視圖控制器(UIViewController)

三級控制器的搭建方法:首先将Window的根視圖設為标簽控制器

特别強調一點:建立三級控制器的時候,一定要先建立子視圖,再自定義标簽欄,不能颠倒,不然會導緻标簽欄按鈕無法點選

方法1:用标簽控制器管理5個導航控制器,每個導航控制器再管理一個視圖控制器(這裡每一組導航控制器和視圖控制器組是通過storyBoard畫的)

//首頁
    UIStoryboard * homeStory = [UIStoryboard storyboardWithName:@"Home" bundle:nil];
    UINavigationController * homeNav = [homeStory instantiateInitialViewController];
    NSArray * arr = @[homeNav,...];
    self.viewControllers = arr;

//自定義标簽欄
-(void)_initTab
{
    UIImageView * tabView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, kScreenWidth, 49)];
    
    [self.tabBar addSubview:tabView];
    for (int i = 0; i < 5; i++)
    {
        UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.tag = 100 + i;
        [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
        button.frame = CGRectMake(kScreenWidth/5.0*i, 0, kScreenWidth/5.0, 49);
        [tabView addSubview:button];
    }
}
           

方法2:和方法1類似,隻不過是用純代碼建立

//    建立子視圖
    HomeViewController * home = [[HomeViewController alloc]init];
//    将子視圖添加到導航控制器中
    NSArray * views = @[home,...];
NSMutableArray * navigations = [[NSMutableArray alloc]init];
    
    for (int i = 0; i<5; i++)
    {
        UINavigationController * navigation = [[UINavigationController alloc]initWithRootViewController:views[i]];
        
        [navigations addObject:navigation];
        
    }
    
    self.viewControllers = navigations;


           

方法3:使用視圖控制器(ViewController)的子控制器來控制5個導航控制器,( 這裡每一組導航控制器和視圖控制器組是通過storyBoard畫的)

//   通過storyBoard檔案獲得導航控制器
UIStoryboard * homeBoard = [UIStoryboard storyboardWithName:@"Home" bundle:nil];
UINavigationController * homeNav = [homeBoard instantiateInitialViewController];
NSArray * arr = @[homeNav,...];
 //   将5個控制器交給目前控制器(Viewcontroller)
    for (int i = 0; i<arr.count; i++)
    {
        UINavigationController * nav = arr[i];
//        将nav作為目前對象的子控制器
        [self addChildViewController:nav];
    }
// 設定預設顯示的視圖
    UIViewController * viewCtrl = self.childViewControllers[0];
    [self.view addSubview:viewCtrl.view];

//點選最下方按鈕的時候切換視圖(做到标簽控制器的效果),這裡要聲明一個selectIndex屬性,因為不是标簽控制器,自身沒有selectIndex屬性
//重寫selectIndex的setter方法
-(void)setSelectIndex:(NSInteger)selectIndex
{
//    1,取得目前正在顯示的視圖控制器
    UIViewController * lastViewCtrl = self.childViewControllers[_selectIndex];
//    2,移除目前正在顯示的視圖控制器
    [lastViewCtrl.view removeFromSuperview];
//    3,取得選中的視圖控制器
    UIViewController * selectCtrl = self.childViewControllers[selectIndex];
//    4,添加選中的視圖控制器
    [self.view insertSubview:selectCtrl.view aboveSubview:lastViewCtrl.view];
//    5,将最下方标簽視圖移到最上方
   [self.view bringSubviewToFront:_tabbarView];
   _selectIndex = selectIndex;
}
           

方法4:使用視圖控制器(ViewController)的子控制器來控制5個導航控制器(這裡每一組導航控制器和視圖控制器組是通過純代碼寫的)

請大家參考上面幾個例子自己寫一下

繼續閱讀