项目截图

当我接到如上图这个需求的时候,评估了一下。感觉如上图的效果用自定义UITabBar的方式就可以实现了(做法类似新浪微博的自定义UITabBar中的不规则按钮),没错,就是干。一番折腾之后,我实现了自己的自定义UITabBar,然后一经测试,问题出来了。

当navigationController拥有超过2个ViewController的时候,我使用self.navigationController popToViewController: animated:方法的时候会出现系统自带的UITabBar的按钮和我自定义UITabBar的按钮重叠的问题。

这下坑爹了吧,我明明在自定义UITabbar按钮的时候把系统自带的UITabbar里面的控件删掉了啊!那要不将就着用吧,不要使用popToViewController操作就好了吧,这个是坑爹和坑队友了,让团队里的其它人都不能使用self.navigationController popToViewController: animated:方法了。

这个时候就要换个思路来了,我一定要自定义UITabBar么? 有没有办法点击按钮的时候不要去跳到某个ViewController,而是执行自定义的事件。并且本来UITabBar里面的按钮的图片也是可以调位置的,这样是不是就完美解决这个需求了呢?程序员就是一类不断遇到问题并解决问题的人呐。

找到了UITabBarController的代理UITabBarControllerDelegate,看了看里面的方法,有发现了。点击了UITabBar的按钮之后,UITabBarController会执行UITabBarControllerDelegate的以下方法,并将要跳转到的UIViewController作为参数传递给一下代理方法。如果代理方法返回YES那么UITabBarController就会正常跳转,如果返回NO,那么就不会做跳转动作。方法如下:

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

理清思路了,接下来就上代码了。

 

1、为了方便,基本上所有的代码都是写在AppDelegate

2、分别创建了A,B,C,D这四个ViewController,每个ViewController有一个用于区别彼此的文本。

3、为每个ViewController创建对应的UITabBarItem。

4、创建四个对应ViewController的对象。

5、将ViewController的对象放到数组容器里面。

6、设置UITabBarController的viewControllers属性,设置UITabBarController的代理,设置UITabBarController为window的RootViewController。

再来一个图

 

7、实现UITabBarController的队友代理方法,判断是否是要跳转到D ViewController,如果是的话,那么就不要跳转了,如果不是那么不做处理。

8、做出一个弹窗提示,做Demo我就比较随意点喽,还是直接用UIAlertView来提示。

9、如左边模拟器运行图所示,点击第四个按钮,会有弹窗出现,Xcode底部输出对应的LOG。

10、这个弹窗只是做一个抛砖引玉的效果,在捕捉到UITabBar的按钮点击事件之后,你就可以实现你的业务逻辑了,而且不用担心和系统UITabBar的兼容问题(因为你本来就没有做改变),也不用担心队友的各种popToViewController操作

iOS 修改UITabBar的默认点击行为的更多相关文章

  1. iOS运用runtime全局修改UILabel的默认字体

    iOS运用runtime全局修改UILabel的默认字体 一.需求背景介绍 在项目比较成熟的基础上,遇到了这样一个需求,应用中需要引入新的字体,需要更换所有Label的默认字体,但是同时,对于一些特殊 ...

  2. 将iOS中Safari 的默认搜索引擎由google.cn改为google.com的方法

    众所周知虽然Google大部分的业务已经迁出中国大陆,访问Google的中国站点只会出现一个投影网站,但是很长一段时间里如果想要访问Google仍然能跳转到google.com.hk这个香港的节点,这 ...

  3. Android Launcher分析和修改1——Launcher默认界面配置(default_workspace)

    最近工作都在修改Launcher,所以打算把分析源码和修改源码的过程记录下来,最近会写一些关于Launcher的分析和修改博文.因为我是修改4.0.3的Launcher,所以后面文章里面的Launch ...

  4. MyEclipse如何修改XML文件默认打开的编辑器

    1.MyEclipse如何修改XML文件默认打开的编辑器 Windows--->Preferences--->General--->Editors--->File Associ ...

  5. 如何修改WordPress网站默认登录地址wp-admin

    使用过WordPress程序建网站的学员都知道,我们使用Wordpress建好的网站,它的网站登录后台就是“网站域名/wp-admin”.如下图: 为了网站安全,如何修改Wordpress网站默认登录 ...

  6. 如何修改 WordPress 的默认 Gravatar 头像

    如何修改 WordPress 的默认 Gravatar 头像? wordpress默认的头像是下面这种 在Settings的Discussion中,默认选择第一个Mystery Person, 意思是 ...

  7. IOS 修改UIAlertController的按钮标题的字体颜色,字号,内容

    IOS 修改UIAlertController的按钮标题的字体颜色,字号,内容 UIAlertController *alertVC = [UIAlertController alertControl ...

  8. StringGrid 实例3: 本例功能: 1、修改 TStringGrid的默认宽与高; 2、添加行; 3、确认当前单元并赋值.

    实例3: 本例功能: 1.修改 TStringGrid的默认宽与高; 2.添加行; 3.确认当前单元并赋值. 实例图形:

  9. xampp默认mysql密码设置,修改mysql的默认空密码

    xampp默认mysql密码设置,修改mysql的默认空密码 分类: xampp2012-09-12 11:24 30264人阅读 评论(5) 收藏 举报 mysqlphpmyadminauthent ...

随机推荐

  1. jssor/slider图片的问题

    用jssor/slider这个控件,在显示图片的时候,每张图片都被拉伸到最大的图片的宽度和高度,导致变形,怎么处理? [答案] Yes. With no u="image" ima ...

  2. [Spring Boot] Introduce to Mockito

    We have the implemetion: @SpringBootApplication public class MockitoDemoApplication { public static ...

  3. 程序员需要经纪人吗?10x 最好的程序员其生产力相当于同行的 10 倍~

    原文地址 10x 起源于技术界一个流行的说法,即最好的程序员是超级明星,其生产力相当于同行的 10 倍: Google 园区以好玩的设施闻名:小憩舱.球坑.按摩.干洗.随便吃到饱的自助餐.(为了拍人才 ...

  4. tomcat中的日志开关文件(logging.properties)介绍

    以tomcat-6.0.29为例: http://www.ossez.com/thread-18138-1-1.html #配置tomcat的日志输出方式,这里表示文件输出和控制台输出.handler ...

  5. 部分Android或IOS手机拍照后照片被旋转的问题

    1.我们平时手机拍的照片,传到电脑后,使用Photoshop或者其它图片浏览工具打开时,发现图片是被转过的.可是Windows上预览却是正的.其实原因是部分Android或IOS手机拍照后,将图片角度 ...

  6. vue循环中的v-show

    v-show如果使用循环对象的属性来时控制, 这个属性必须是加载时就存在的 <div class="list-group col-sm-12" v-for="(is ...

  7. CTP交易函数大全

    管理接口 交易接口

  8. 代码实现分析mpeg-2文件

    1.概述 把上一篇文章中讲到的mpeg-2文件结构分析用代码实现,结合mpeg-2文件分析.才easy看懂. 2.代码 /* *本程序主要分析MPEG-2文件 *作者:缪国凯(MK) *8214860 ...

  9. intellij 创建测试

    之后再test目录下面创建java的文件夹,悲催的发现不能创建.想了好久,之后找到再本机的目录,手动创建java文件夹,然后点击test文件夹 ,并且点击下面的Tests文件夹 设置完test-> ...

  10. ES6学习笔记二:各种扩展

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7242967.html 一:字符串扩展 1:字符串遍历器 for (let char of str) { // ...