iOS开发中的错误整理,关于用绑定Tag取控件的注意事项,有时候不绑定也是个错!
如图:红色框中是个自定义的导航工具条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取控件的注意事项,有时候不绑定也是个错!的更多相关文章
- iOS开发中的错误整理,通过storyboard做项目,遇到view看不见,或者view被压缩的情况
前言:在网易新闻的练习中遇到了这个错误 注意:练习中遇到了如图的bug,主要是因为用storyboard布局 600 * 600 显示的时候要经过自动布局,缩小到相应手机的屏幕大小.也就是有的尺寸 ...
- iOS开发中的错误整理,百思项目'我的'模块,tableFooterViewHeight的问题.提醒自己对KVO和Block的运用欠缺
一.错误分析:由于tableFooterView中的数据是通过请求服务器后得到的,tableFooterViewHeight也是根据请求过来的数据经过布局子控件而计算出来的.(注意:计算高度是在子线程 ...
- iOS开发中的错误整理,(百思项目,指示器位置)设置控件尺寸和点坐标,先设置尺寸,再设置点坐标
之前对控件的尺寸和点的坐标的设置从来都是想到什么写什么,从来没有关心过顺序.然后就有了这次的血的教训!!!!! 下面是错误的截图,先设置的中心点,然后设置的宽度.程序运行就这样了,点别的没有毛病!!! ...
- iOS开发中的错误整理,IOS9中canOpenURL调用失败分析
由于IOS加入对用户隐私以及禁止扫描系统信息的控制,目前通过canOpenURL的方法来判断用户是否安装特定app,则会出现-canOpenURL: failed for URL: "ABC ...
- 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 ...
- iOS开发中的错误整理,iOS9之后的UIWindow(TopWindow)以及UIWindow与statusBar的关系
iOS9之后的UIWindow的问题(TopWindow),以及UIWindow与statusBar之间的联系 1.出现的问题 iOS9之后UIWindow必须要指定一个根控制器,不然会报错!iOS9 ...
- iOS开发中的错误整理,pod文件Install失败
一.之前用黑苹果,编辑pod文件用一下格式 platform :ios, "8.0" pod "MJExtension" pod "MJRefresh ...
- iOS开发中的错误整理,线程之间通信练习,加载图片的练习中出现的错误 -- Http请求错误
控制台打印:Application Transport Security has blocked a cleartext HTTP (http://) resource load since it i ...
- iOS开发中的错误整理,AFN框架和MJRefresh框架搭配应该注意的问题
注意问题一:每次请求之前先将之前的请求取消 注意问题二:请求成功之后要判断footer或者header的显示状态 首次下拉刷新,要判断是否已经全部 ...
随机推荐
- Hadoop_HDFS架构和HA机制
Hadoop学习笔记总结 01.HDFS架构 1. NameNode和ResourceManager NameNode负责HDFS,从节点是DataNode:ResourceManager负责MapR ...
- Half Wavelength Dipole Antenna
Reference : 1. wikipedia The dipole antenna is the simplest and most widely used class of antenna.It ...
- js制作倒计时效果
该程序可以计算任意指定的两个日期中间的差值. 本例子的指定日期是2017年1月1日,当前时间是2016年10月21日:计算它们之间的差值,在网页上显示如图所示: 关键部分代码: var nowtime ...
- 深度优先搜索 codevs 1064 虫食算
codevs 1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所 ...
- 设计模式笔记感悟 - Creational篇
body,td,p { // 这对大括号里描述网页的背景 margin-left:40px; margin-right:40px; font-size: 10pt; } div.vim { width ...
- Android网络之数据解析----使用Google Gson解析Json数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- java 19 -14 File类的判断并输出案例
package zl_file; import java.io.File; import java.io.FilenameFilter; /* 需求: 判断E盘目录下是否有后缀名为.jpg的文件,如果 ...
- java 16-2 ArrayList的练习2
需求:去除集合中自定义对象的重复值(对象的成员变量值都相同 注意: 我们按照和字符串一样的操作,发现出问题了. 为什么呢? 我们必须思考哪里会出问题? 通过简单的分析,我们知道问题出现在了判断上. ...
- EasyUI中页面必须刷新才显示tree组件最新数据的BUG解决方案
在URL地址后面加个时间戳,这样就避免从浏览器缓存里读取数据了 $("#devtree").tree({ url: '/Deviceinfo/ModelsTree.aspx?cmd ...