纯代码搭建iOS三级结构(UITabbarController+UINavigationController+UIViewController)
声明:这里所指的三级结构不是网上百度中所经常提及的三级框架或者MVC模式,而是指UITabbarController+UINavigationController+UIViewController。
效果图
技术要点
三者其实是层层包含的关系,以tabbar为起点(接下来就不写类名全程了,看官们看懂就好),一个tabbar对应多个navigation,每个navigation对应着1个viewcontroller(当然实际上是可以多个的,在这里用不上而已),这样一来整个视图看起来就成了可以切换不同导航栏标题的多个视图。
tabbar的设置
tabbar设置可以很简单,但是这里我们搞复杂点,利用自定义的button放入tabbar中,当然在此之前,我们需要将原有tabbar中的UITabBarButton类型的所有`UITabBarButton
类型的视图给删除即可。
#pragma mark 删除tabbar原始的item - (void)removePreItem { for (UIView *view in self.tabBar.subviews) { if ([view isKindOfClass:NSClassFromString(@"UITabBarButton")]) { [view removeFromSuperview]; } } #pragma mark 即将读取视图 - (void)viewWillAppear:(BOOL)animated { [self removePreItem]; [super viewWillAppear:animated]; }
有一点要提示的是删除原有tabbar中item的方法要在viewWillAppear中执行,在viewDidLoad中执行则不会删除。
删除完了之后,增加我们想要添加的按钮并设置点击事件——切换视图控制器。在tabbar中,切换视图控制器其实很简单,只需要self.selectedIndex = i;
即可。
CGFloat itemOffsetX; CGFloat itemOffsetY; #pragma mark 增加自定义item - (void)createItems { //求图标宽度 CGFloat tabbarWidth = self.tabBar.bounds.size.width; CGFloat itemWidth = (tabbarWidth - itemOffsetX * 5) / 4; //求图标高度 CGFloat tabbarHeight = self.tabBar.bounds.size.height; CGFloat itemHeight = tabbarHeight - itemOffsetY * 2; //新建button for(int i = 0; i < 4; i ++) { UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; btn.tag = i; [btn addTarget:self action:@selector(actItem:) forControlEvents:UIControlEventTouchUpInside]; btn.frame = CGRectMake(itemOffsetX * (i+1) + itemWidth * i, 0, itemWidth, itemHeight); [btn setTitle:[NSString stringWithFormat:@"%d",i+1] forState:UIControlStateNormal]; [btn setTitleColor:REDCOLOR forState:UIControlStateNormal]; [btn setTitleColor:YELLOWCOLOR forState:UIControlStateHighlighted]; [self.tabBar addSubview:btn]; } } #pragma mark tabbar中item点击事件 - (void)actItem:(UIButton *)sender { NSLog(@"click %@ button",sender.titleLabel.text); self.selectedIndex = sender.tag % 10; }
接下来是给tabbar添加视图,这些子视图应该是navigation,然后navigation中才把对应的viewcontroller收入囊中。navigation除了能像表层看到的那样能提供导航栏之外,实际上像栈那样push和pop栈中的viewcontroller。
#pragma mark 添加4个MainNavViewController到视图中 - (void)addNavViewController { MainNavViewController *nav1 = [[MainNavViewController alloc]init]; nav1.viewControllers = @[[[FirstViewController alloc]init]]; MainNavViewController *nav2 = [[MainNavViewController alloc]init]; nav2.viewControllers = @[[[SecondViewController alloc]init]]; MainNavViewController *nav3 = [[MainNavViewController alloc]init]; nav3.viewControllers = @[[[ThirdViewController alloc]init]]; MainNavViewController *nav4 = [[MainNavViewController alloc]init]; nav4.viewControllers = @[[[FourthViewController alloc]init]]; NSArray *navViewControllers = @[nav1, nav2, nav3, nav4]; self.selectedIndex = 0; self.viewControllers = navViewControllers; }
要修改导航栏标题不是在navigation更不是在tabbar,而是在navigation中的viewcontroller中修改,修改很简单,关键是要理解修改导航栏标题的语句是放在navigation中的viewcontroller里面。
//在viewcontroller中设置 self.navigationItem.title = @"第四";
代码下载链接:http://download.csdn.net/detail/ecjtuacm_yuewei/9806036
本文来自博客园,作者:MrYu4,转载请注明原文链接:https://www.cnblogs.com/MrYU4/p/15778891.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了