如图:红色框中是个自定义的导航工具条titlesView(没有绑定Tag),工具条中有五个按钮(按钮绑定了Tag)以及一个红色的指示器indicatorView(没有绑定Tag),下面的蓝色是可以滚动的scrollView,拖动scrollView,红色指示器会滚到对应按钮的下面,并且按钮呈红色显示.

在scrollView的代理方法scrollViewDidEndDecelerating:中通过

  • 获得按钮首先注意的一点是,当指定的Tag为0时,会默认首先拿到的是调用这个方法的控件,也就是父控件titlesView,导致报错
  • 其次注意的是,除了按钮还有别的干扰控件(这里只指示器indicatorView),干扰控件添加到父控件的时间比按钮添加到父控件的时间早,并且没有绑定Tag,通过viewWithTag:方法也会首先拿到干扰控件,导致报错.

解决方案:

  • 方案一:将父控件以及干扰控件都绑定Tag,例如-1 -2 等
  • 方案二:不适合于父控件,也就是说父控件必须绑定个Tag.其余干扰控件可以在按钮都addView到父控件后,干扰控件再add到父控件.(不建议用这种,当代码篇幅很长的时候,最后突然来了句addView:有时候真的很费解!)
 - (void)setupTitlesView
{
CGFloat width = self.view.width;
CGFloat height = ;
UIView *titlesView = [[UIView alloc] init];
titlesView.frame = CGRectMake(, , width, height);
titlesView.backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.6];
titlesView.tag = -; // scroll滚动完后要通过按钮绑定的tag,得到按钮并设置按钮属性,如果父控件中子控件不止有按钮,别的view的tag不绑定默认也是0,当通过tag==0找按钮的时候,就会报错.所以这里的解决办法是讲其余view绑定别的tag
[self.view addSubview:titlesView];
self.titlesView = titlesView; // 添加指示器
UIView *indicatorView = [[UIView alloc] init];
indicatorView.backgroundColor = [UIColor redColor];
indicatorView.height = ;
indicatorView.y = titlesView.height - indicatorView.height;
indicatorView.tag = -; // 理由同上,不设置也可以,但是要保证这些view的添加要添加到按钮的后面
[titlesView addSubview:indicatorView];
self.indicatorView = indicatorView; NSArray *items = @[@"全部",@"视频",@"音频",@"图片",@"段子"]; CGFloat btnW = titlesView.width / items.count;
CGFloat btnH = titlesView.height;
CGFloat btnX = ;
CGFloat btnY = ;
// 循环添加按钮
for (int i = ; i < items.count; i++) {
UIButton *btn = [[UIButton alloc] init];
btnX = btnW * i;
btn.frame = CGRectMake(btnX, btnY, btnW, btnH);
[btn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
[btn setTitleColor:[UIColor redColor] forState:UIControlStateDisabled];
[btn setTitle:items[i] forState:UIControlStateNormal];
btn.titleLabel.font = [UIFont systemFontOfSize:];
btn.tag = i; // 给按钮添加绑定tag
[btn addTarget:self action:@selector(titleClick:) forControlEvents:UIControlEventTouchUpInside];
[titlesView addSubview:btn]; [btn layoutIfNeeded]; if (i == ) {
self.selectedButton = btn;
btn.enabled = NO;
// 以后设置尺寸,先设置尺寸,再设置点
self.indicatorView.width = btn.titleLabel.width;
self.indicatorView.centerX = btn.centerX;
}
}
}

iOS开发中的错误整理,关于用绑定Tag取控件的注意事项,有时候不绑定也是个错!的更多相关文章

  1. iOS开发中的错误整理,通过storyboard做项目,遇到view看不见,或者view被压缩的情况

    前言:在网易新闻的练习中遇到了这个错误 注意:练习中遇到了如图的bug,主要是因为用storyboard布局 600 * 600   显示的时候要经过自动布局,缩小到相应手机的屏幕大小.也就是有的尺寸 ...

  2. iOS开发中的错误整理,百思项目'我的'模块,tableFooterViewHeight的问题.提醒自己对KVO和Block的运用欠缺

    一.错误分析:由于tableFooterView中的数据是通过请求服务器后得到的,tableFooterViewHeight也是根据请求过来的数据经过布局子控件而计算出来的.(注意:计算高度是在子线程 ...

  3. iOS开发中的错误整理,(百思项目,指示器位置)设置控件尺寸和点坐标,先设置尺寸,再设置点坐标

    之前对控件的尺寸和点的坐标的设置从来都是想到什么写什么,从来没有关心过顺序.然后就有了这次的血的教训!!!!! 下面是错误的截图,先设置的中心点,然后设置的宽度.程序运行就这样了,点别的没有毛病!!! ...

  4. iOS开发中的错误整理,IOS9中canOpenURL调用失败分析

    由于IOS加入对用户隐私以及禁止扫描系统信息的控制,目前通过canOpenURL的方法来判断用户是否安装特定app,则会出现-canOpenURL: failed for URL: "ABC ...

  5. iOS开发中的错误整理,Changing the delegate of a tab bar managed by a tab bar controller is not allowed

    iOS [错误:'Changing the delegate of a tab bar managed by a tab bar controller is not allowed.'] 错误:'Ch ...

  6. iOS开发中的错误整理,iOS9之后的UIWindow(TopWindow)以及UIWindow与statusBar的关系

    iOS9之后的UIWindow的问题(TopWindow),以及UIWindow与statusBar之间的联系 1.出现的问题 iOS9之后UIWindow必须要指定一个根控制器,不然会报错!iOS9 ...

  7. iOS开发中的错误整理,pod文件Install失败

    一.之前用黑苹果,编辑pod文件用一下格式 platform :ios, "8.0" pod "MJExtension" pod "MJRefresh ...

  8. iOS开发中的错误整理,线程之间通信练习,加载图片的练习中出现的错误 -- Http请求错误

    控制台打印:Application Transport Security has blocked a cleartext HTTP (http://) resource load since it i ...

  9. iOS开发中的错误整理,AFN框架和MJRefresh框架搭配应该注意的问题

    注意问题一:每次请求之前先将之前的请求取消                            注意问题二:请求成功之后要判断footer或者header的显示状态 首次下拉刷新,要判断是否已经全部 ...

随机推荐

  1. [转]angularjs 设置全局变量的3种方法

    本文转自:http://blog.51yip.com/jsjquery/1601.html angularjs自身有二种,设置全局变量的方法,在加上js的设置全局变量的方法,总共有三种.要实现的功能是 ...

  2. TYVJ1288 飘飘乎居士取能量块 -SilverN

    描述   9月21日,今天是pink的生日,飘飘乎居士当然要去别人的领土大闹一番啦!  为了收集更多的能量到pink家大闹,飘飘乎居士准备从后花园中取出自己多年积攒的p个能量块.后花园一共被划分n个地 ...

  3. LeetCode题解-----First Missing Positive

    Given an unsorted integer array, find the first missing positive integer. For example,Given [1,2,0]  ...

  4. 【转载】jQuery Validate 菜鸟教程

    文章1:http://www.runoob.com/jquery/jquery-plugin-validate.html          (jQuery Validate 菜鸟教程)

  5. 用Access作为后台数据库支撑,书写一个用C#写入记录的案例

    具体的步骤: 1.创建并打开一个OleDbConnection对象 2.创建插入的SQL语句 3.创建一个OleDbCommand对象 4.使用OleDbCommand对象来插入数据 5.关闭OleD ...

  6. AutoIT脚本的语法特征

    这里主要介绍AutoIT的脚本语法特征,包括变量.关键字.宏.设置选项等,详细的语法细节,可以参考其用户手册,也可以去AutoIT中文论坛(www.autoit.net.cn)交流. 1. 变量 Au ...

  7. finder怎么才能找到library

    右键Finder——前往目录 输入~/Library

  8. (转载)Apache下error.log文件太大的处理

    偶尔发现Apache下的错误日志非常的大,有5G多,先停止Apache服务的所有进程,最简单就是输命令:net stop apache2.4,然后删除 Apache/logs/目录下的 error.l ...

  9. C#中事件的继承

    C#中的子类无法调用父类的事件,可以通过在父类中创建一个方法来调用父类的事件,而子类通过调用父类的方法来触发事件. class parent { protected string name; publ ...

  10. 我所知道的HttpContext.Current

    在MVC中,HttpContext.Current是比较常见的对象,可以用它来进行Session,Cache等的保存等.但是它并不是无处不在的,下面就慢慢来揭开它的面纱. 当我们向服务端发送请求的时候 ...