项目截图

当我接到如上图这个需求的时候,评估了一下。感觉如上图的效果用自定义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. IIS 7.5: HOW TO ENABLE TLS 1.1 AND TLS 1.2

    In IIS 7.5, which is installed on Windows 2008 R2 servers, only SSL 3.0 and TLS 1.0 are enabled for ...

  2. C#.NET常见问题(FAQ)-如何让Listbox支持多选

    把SelectionMode改成MultiExtended   更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai123   我的在线 ...

  3. CAD中批量打印

    同事在网上找各种软件来实现CAD图的批量打印,总是问题多多.于是,我想到一个更方便的解决方法,即只要我将一个打印出来,然后就可以用批量处理来实现. 1.在CAD中输入plot命令(或快捷键Ctrl+P ...

  4. oj

    https://github.com/zhblue/hustoj insert into privilege(user_id,rightstr) values('wxy','administrator ...

  5. hadoop mahout 算法和API说明

    org.apache.mahout.cf.taste.hadoop.item.RecommenderJob.main(args) --input 偏好数据路径,文本文件.格式 userid\t ite ...

  6. 【转发】Linq To EF添加记录后获取添加的自增ID和叫“ID”的列不是自增列不让插入的问题

    1:添加记录后,如何获取新添加的ID的值 比如,一个实体 TestEntity   对应一个表TestEntity(ID主键自增,Name,age),使用linq to ef   添加一条记录后,如何 ...

  7. 让span对宽度有响应而且兼容多种浏览器

    span {display:-moz-inline-box; display:inline-block; width:20px;height:20px;}

  8. Multitenant Architecture---PDB与CDB

    一.多租户框架 多租户技术(英语:multi-tenancy technology)或称多重租赁技术,是一种软件架构技术,它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件,并且仍可确保各用 ...

  9. Lucene解析 - 基本概念

    Elasticsearch 权威指南中文版  https://www.elastic.co/guide/cn/elasticsearch/guide/cn/index.html   对于跳跃表,我们看 ...

  10. django之创建站点之基本流程

    创建工程: 1.在D盘下创建一个文件夹名为djangoweb,切换到文件夹所在目录 C:\Administrator>d: D:\>cd d:\djangoweb 2.创建工程(成功没有提 ...