UITabBarController的一些属性

本文详细介绍了如何在iOS开发中使用UITabBarController,包括创建和设置视图控制器,自定义tabBar,以及实现UITabBarControllerDelegate协议来处理用户交互。文中提到,可以通过设置tabBarItem的属性来定制每个标签的显示,同时讲解了如何处理超过5个标签的情况。此外,还展示了如何在用户选择标签时保存和恢复选择状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.基本概念

 //1.创建视图控制器(视图控制器,导航控制器)的对象

    FirstViewController *vc0 = [[FirstViewController alloc]init];

 //设置title和image

    //视图控制器的title属性可以同时设置tabBarItem的title和navigationItem的title

   vc0.title = @"vc0";

    //    vc0.tabBarItem.title = @"vc0";

    //    vc0.navigationItem.title = @"vc0";

//tabBarController的标签一般不超过5个。超过5个的话,从第五个开始的剩余的视图控制器会被放到系统自动创建的moreViewController里面,由moreViewController来进行管理。moreNavigationController没有下标

   UINavigationController *navC0 = [[UINavigationController alloc]initWithRootViewController:vc0];

//在vc4上添加系统样式的标签元素

    //tabBar上放的必须是UITabBarItem类型的

    //1.创建系统风格的UITabBarItem:不能修改vc4.tabBarItem.title和vc4.tabBarItem.image --> 修改不起作用

    UITabBarItem *item40 = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemFavorites tag:100];

//    //2.同时设置title/image/selectedImage

    UITabBarItem *item41 = [[UITabBarItem alloc]initWithTitle:@"vc4" image:[UIImage imageNamed:@"tab_s"selectedImage:nil];

//    //3.同时设置title/image/tag

    UITabBarItem *item42 = [[UITabBarItem alloc]initWithTitle:@"vc4" image:[UIImage imageNamed:@"tab_s"tag:100];

//    

   vc4.tabBarItem = item40;

 

  //2.把要添加的视图控制器的对象放到一个数组中

    NSArray *arr = @[navC0,navC1,vc2,vc3,vc4];

    //UITabBarController:继承自UIViewController,本质上还是视图控制器。标签栏控制器。

    //用来管理视图控制器的软件结构级的组件。UITabBarController里面存放的视图控制器都是并列关系,互不影响。

    //3.把数组中的视图控制器的对象添加到tabBarController中

    UITabBarController *tabBarC = [[UITabBarController alloc]init];

    //数组中存放的必须是普通视图控制器或导航控制器的对象的地址

    tabBarC.delegate = self;

    tabBarC.viewControllers = arr;

    //设置默认选中项 --> 默认选中的是第0个

    tabBarC.selectedIndex = 0;

    //从NSUserDefaults中获取存储的index

    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];

    NSInteger index = [ud integerForKey:@"selectedIndex"];

    tabBarC.selectedIndex = index;

    //4.把tabBarC设置为window的根视图控制器

    self.window.rootViewController = tabBarC;

    [tabBarC release];

2.UITabBarControllerDelegate协议

-(void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed{

    NSLog(@"编辑结束");

}

-(void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers{

    NSLog(@"即将开始编辑");

}

-(void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed{

    NSLog(@"即将结束编辑");

}

-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{

    //selectedIndex:选中的视图控制器的下标

    NSLog(@"选中的控制器是:%d",tabBarController.selectedIndex);

    //把选中的视图控制器的index做永久性存储,下次重新进入程序时,设置tabBarController的默认选中项为存储的index选项

    //1.获取NSUserDefaults的对象

    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];

    //2.存数据

    [ud setInteger:tabBarController.selectedIndex forKey:@"selectedIndex"];

    //3.同步磁盘

    [ud synchronize];

}

-(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController{

    //是否允许选择某个视图控制器 -->

    //如果选中的是第二个下标对应的视图控制器 --> 不允许选择

    static int cnt = 0;

    cnt++;

    if (cnt%2 == 0) {

        if (tabBarController.selectedIndex == 2) {

            return NO;

        }

        return YES;

    }

    return YES;

}

 

 

3.lzx的

#if 0 //第一种方法  获取保存的索引

    

    //获取本地保存的标签索引

    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];

    NSInteger index = [ud integerForKey:@"selectIndex"];

    //moreNavigationController 不在tabBarController的子视图控制器数组

    if (index > tab.viewControllers.count-1) {

        //指定选中的视图控制器

        tab.selectedViewController = tab.moreNavigationController;

    }else{

        tab.selectedIndex = index;

    }

#else//第二种方法 获取保存的标签的标题

    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];

    NSString *title = [ud objectForKey:@"selectTitle"];

    NSInteger cnt = 0;

    //遍历tabBarController的数组

    for (UIViewController *vc in tab.viewControllers) {

        //判断是否是选中的标题

        if ([title isEqualToString:vc.tabBarItem.title]) {

            //指定保存的标签对应的视图控制器

            tab.selectedViewController = vc;

            break;//找到就跳出

        }

        cnt++;

        if (cnt == tab.viewControllers.count) {

            //说明没有找到指定的 那么应该选中的是more

            tab.selectedViewController = tab.moreNavigationController;

        }

    }

 

#endif

 

#pragma mark -UITabBarController 协议

//将要选中标签的时候调用

//是否可以选中指定的标签  将要选中 还没有选中

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {

    

    if ([viewController.tabBarItem.title isEqualToString:@"second"]) {

        //如果标签标题是second 那么不能选中

        return NO;

    }

    return YES;

}

//已经选中标签 之后调用

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {

   

#if 1//第二种方法 已经选中之后保存标签的标题

    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];

    //保存标签标签

    [ud setObject:viewController.tabBarItem.title forKey:@"selectTitle"];

    [ud synchronize];

    

#else//第一种 已经选中之后保存 已经选中的标签的索引

    /*

     tabBarController.selectedIndex这个值 已经选中才会修改

     */

    NSLog(@"selectedIndex:%d",tabBarController.selectedIndex);

    //这时可以把已经选中的标签索引 进行本地数据持久化存储

    NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];

    //本地保存 选中的标签索引

    [ud setInteger:tabBarController.selectedIndex forKey:@"selectIndex"];

    [ud synchronize];

#endif

}

 

 

 

 

 

 

 

 

4.自定义tabBar(system&custom)

/*

 如果 tabBar 是一个不规则的 或者 没有在底部 那么这时候我们可以定制一下tabBar 

 自己实现一个tabBar 替换掉 系统的

 1.隐藏系统的tabBar

 2.用UIView + UIButton +UILabel

   或者用UIImageView + UIButton +UILabel 组合

 //如何 控制子视图切换 

 通过点击button 修改 tabBarController的selectedIndex 或者selectedViewController 就可以切换子视图控制器界面

 

 */

其实自定制的tabBar可以设置在上面,只要UIView或者UIImageView设置好就行了

 

-(void)createViewControllers{

    //1.读plist文件

    NSString *path = [[NSBundle mainBundlepathForResource:@"CustomTabBarList" ofType:@"plist"];

    NSArray *plistArr = [NSArray arrayWithContentsOfFile:path];

    NSMutableArray *vcArr = [[NSMutableArray alloc]init];

    for (int i = 0; i < [plistArr count]; i++) {

        NSDictionary *dict = plistArr[i];

        //2.获取视图控制器的名字

        NSString *name = [dict objectForKey:@"viewController"];

        //3.创建视图控制器的对象

        Class cl = NSClassFromString(name);

        UIViewController *vc = [(UIViewController *)[cl allocinit];

        [vcArr addObject:vc];

        [vc release];

        

    }

    self.viewControllers = vcArr;

    [vcArr release];

    //4.隐藏系统的tabBar

    self.tabBar.hidden = YES;

    [self customTabBar];

}

#pragma mark - customTabBar

-(void)customTabBar{

    //tabBar:默认高度是49

    //UIView也可以

    UIImageView *bgIv = [[UIImageView alloc]initWithFrame:CGRectMake(0self.view.frame.size.height - 49self.view.frame.size.width49)];

    bgIv.tag = 200;

    //手动打开用户交互

    bgIv.userInteractionEnabled = YES;

    bgIv.image = [UIImage imageNamed:@"tabbg"];

    [self.view addSubview:bgIv];

    [bgIv release];

    

    for (int i = 0; i < 4; i++) {

        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

        btn.frame = CGRectMake(25 + 80*i, 93030);

        [btn setImage:[UIImage imageNamed:[NSString stringWithFormat:@"tab_%d",i]] forState:UIControlStateNormal];

        [btn setImage:[UIImage imageNamed:[NSString stringWithFormat:@"tab_c%d",i]] forState:UIControlStateSelected];

        [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];

        btn.tag = 100 + i;

        [bgIv addSubview:btn];

        if (i == 0) {

            //设置默认选中的是第0个

            btn.selected = YES;

            self.selectedIndex = 0;

            //添加一个label

            UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(2544301)];

            label.backgroundColor = [UIColor orangeColor];

            label.tag = 300;

            [bgIv addSubview:label];

            [label release];

        }

    }

}

-(void)btnClick:(UIButton *)btn{

    //先获取到btn所在的视图

    UIImageView *tmpIv = (UIImageView *)[self.view viewWithTag:200];

    //先把所有按钮的selected置为NO

    /*第一种

    for (int i = 0; i < 4; i++) {

        UIButton *tmpBtn = (UIButton *)[tmpIv viewWithTag:100 + i];

        tmpBtn.selected = NO;

    }

     */

    //第二种:tmpIv上只有label和btn

    NSArray *subArr = tmpIv.subviews;

    for (int i = 0; i < [subArr count]; i++) {

        id obj = [subArr objectAtIndex:i];

        if ([obj isKindOfClass:[UIButton class]]) {

            UIButton *btn = (UIButton *)obj;

            btn.selected = NO;

        }

    }

    //把选中的按钮的selected置为YES

    btn.selected = YES;

    //设置tabBarController的选中index

    self.selectedIndex = btn.tag - 100;

    

    UILabel *tmpLabel = (UILabel *)[tmpIv viewWithTag:300];

    //改变label的frame

    [UIView animateWithDuration:0.2 animations:^{

//        tmpLabel.center = CGPointMake(btn.center.x, btn.center.y + 20);

        tmpLabel.frame = CGRectMake(25 + 80*(btn.tag - 100), tmpLabel.frame.origin.y, tmpLabel.frame.size.width, tmpLabel.frame.size.height);

    }];

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值