您的位置:首页 > 移动开发 > IOS开发

iOS三级控制器的4种创建方法

2015-08-03 13:21 381 查看
三级控制器:视图控制器(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个导航控制器(这里每一组导航控制器和视图控制器组是通过纯代码写的)

请大家参考上面几个例子自己写一下
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: