声明:这里所指的三级结构不是网上百度中所经常提及的三级框架或者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

纯代码搭建iOS三级结构(UITabbarController+UINavigationController+UIViewController)的更多相关文章

  1. BearSkill纯代码搭建iOS界面

    欢迎相同喜欢动效的project师/UI设计师/产品增加我们 iOS动效特攻队–>QQ群:547897182 iOS动效特攻队–>熊熊:648070256 浅谈一下 关于iOS兼容布局一直 ...

  2. 搭建App主流框架_纯代码搭建(OC)

    转载自:http://my.oschina.net/hejunbinlan/blog/529778?fromerr=EmSuX7PR 搭建主流框架界面 源码地址在文章末尾 达成效果 效果图 注:本文部 ...

  3. Masonry -- 使用纯代码进行iOS应用的autolayout自适应布局

    简介 简化iOS应用使用纯代码机型自适应布局的工作,使用一种简洁高效的语法替代NSLayoutConstraints. 项目主页: Masonry 最新示例: 点击下载 项目简议: 如果再看到关于纯代 ...

  4. Masonry — 使用纯代码进行iOS应用的autolayout自适应布局

    本文转载至   http://www.ios122.com/2015/09/masonry/ 简化iOS应用使用纯代码机型自适应布局的工作,使用一种简洁高效的语法替代NSLayoutConstrain ...

  5. (六十二)纯代码搭建UI

    在Xcode6中,去掉了Empty Application的选项,因此可以通过先创建SingleView,再删除storyboard,并且把工程设置中的main Interface清空. 通过AppD ...

  6. iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController)

    iOS开发——实战OC篇&环境搭建之纯代码(玩转UINavigationController与UITabBarController)   这里我们就直接上实例: 一:新建一个项目singleV ...

  7. iOS:删除storyBoard,纯代码实现UITabBarController的视图切换功能

    storyboard是一个很强大的编写代码的辅助工具,可以帮助布局多个视图之间的联系,既直观又能减少代码量:但是,作为一个程序员,在不使用storyboard的情况下,纯代码编写是必须的技能. 下面就 ...

  8. iOS高仿app源码:纯代码打造高仿优质《内涵段子》

    iOS高仿app源码:纯代码打造高仿优质<内涵段子>收藏下来 字数1950 阅读4999 评论173 喜欢133 Github 地址 https://github.com/Charlesy ...

  9. iOS开发 纯代码创建UICollectionView

    转:http://jingyan.baidu.com/article/eb9f7b6d8a81a5869364e8a6.html iOS开发 纯代码创建UICollectionView 习惯了使用xi ...

  10. iOS UICollectionView(转一) XIB+纯代码创建:cell,头脚视图 cell间距

    之前用CollectionViewController只是皮毛,一些iOS从入门到精通的书上也是泛泛而谈.这几天好好的搞了搞苹果的开发文档上CollectionViewController的内容,亲身 ...

随机推荐

  1. Unlink原理和一些手法

    Unlink原理和一些手法 简单介绍一下unlink相关的知识 unlink是利用glibc malloc 的内存回收机制造成攻击的,核心就在于当两个free的堆块在物理上相邻时,会将他们合并,并将原 ...

  2. 一个库帮你轻松的创建漂亮的.NET控制台应用程序

    前言 做过.NET控制台应用程序的同学应该都知道原生的.NET控制台应用程序输出的内容都比较的单调,假如要编写漂亮且美观的控制台输出内容或者样式可能需要花费不少的时间去编写代码和调试.今天大姚给大家分 ...

  3. SpringBoot序列化、反序列化空字符串为null的三种方式

    一.需求:接收前端传入的""空字符串参数,有时候我们需要把它转为null SpringBoot项目 方式:①Jackson(推荐).②切面+反射.③注解+切面+反射 后两种方式,未 ...

  4. 02、Linux 排查

    Linux 分析排查 1.敏感文件信息 1.1.tmp 目录 /tmp:临时目录文件,每个用户都可以对它进行读写操作.因此一个普通用户可以对 /tmp 目录执行读写操作(ls -alt) 筛查 /tm ...

  5. Agile PLM数据库表结构(Oracle)

    刚进公司,任务是接管PLM系统,但是还在给外包团队开发,没有代码.无妨先看业务和数据库,ok,业务看不懂,只能先看数据库,数据库没有数据字典,这个系统没有任何文档产出......练手时发现数据库类型是 ...

  6. C数据结构:KMP算法详解(呕心沥血)

    KMP算法 作者心声 了解暴力求解(必需会) KMP算法详解 记住我这段话(你会爱上它的)← : ①前后缀及其用处 ②求出前后缀的next数组 求出next数组的代码 开始实现KMP算法 结尾 附上源 ...

  7. .NET ASPIRE 预览版 7 发布

    .NET Aspire 预览版 7 并不是原计划的一部分,此预览版有很多重大 API 更改,部分原因是一旦产品发布,我们将致力于稳定的 API 表面.可以说,Aspire团队希望确保在最终发布之前完成 ...

  8. winform——windows 服务的安装 卸载 启动 停止

    安装服务和卸载服务采用process启动命令行的方式.启动服务和停止服务用到了 System.ServiceProcess.ServiceController这个类.   程序是这样运行的,首先启动服 ...

  9. 文件系统(五):exFAT 文件系统原理详解

    前言 exFAT是微软2006年推出的一种文件系统,距今已快二十年,相比于FAT16和FAT32,exFAT还是算年轻.exFAT一直是微软的一个专用文件系统,直到2019年微软发布它的规范,目前微软 ...

  10. linux服务器下安装cbc和ipopt求解器【踩坑总结】

    安装CBC求解器 CBC求解器是一个C++库,我们可以通过以下命令在Linux系统中进行安装: sudo apt-get install coinor-cbc 对于Windows操作系统,可以从CBC ...