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

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

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

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

解决方案:

  • 方案一:将父控件以及干扰控件都绑定Tag,例如-1 -2 等
  • 方案二:不适合于父控件,也就是说父控件必须绑定个Tag.其余干扰控件可以在按钮都addView到父控件后,干扰控件再add到父控件.(不建议用这种,当代码篇幅很长的时候,最后突然来了句addView:有时候真的很费解!)

 1 - (void)setupTitlesView
 2 {
 3     CGFloat width = self.view.width;
 4     CGFloat height = 35;
 5     UIView *titlesView = [[UIView alloc] init];
 6     titlesView.frame = CGRectMake(0, 64, width, height);
 7     titlesView.backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.6];
 8     titlesView.tag = -1; // scroll滚动完后要通过按钮绑定的tag,得到按钮并设置按钮属性,如果父控件中子控件不止有按钮,别的view的tag不绑定默认也是0,当通过tag==0找按钮的时候,就会报错.所以这里的解决办法是讲其余view绑定别的tag
 9     [self.view addSubview:titlesView];
10     self.titlesView = titlesView;
11
12     // 添加指示器
13     UIView *indicatorView = [[UIView alloc] init];
14     indicatorView.backgroundColor = [UIColor redColor];
15     indicatorView.height = 2;
16     indicatorView.y = titlesView.height - indicatorView.height;
17     indicatorView.tag = -2; // 理由同上,不设置也可以,但是要保证这些view的添加要添加到按钮的后面
18     [titlesView addSubview:indicatorView];
19     self.indicatorView = indicatorView;
20
21     NSArray *items = @[@"全部",@"视频",@"音频",@"图片",@"段子"];
22
23     CGFloat btnW = titlesView.width / items.count;
24     CGFloat btnH = titlesView.height;
25     CGFloat btnX = 0;
26     CGFloat btnY = 0;
27     // 循环添加按钮
28     for (int i = 0; i < items.count; i++) {
29         UIButton *btn = [[UIButton alloc] init];
30         btnX = btnW * i;
31         btn.frame = CGRectMake(btnX, btnY, btnW, btnH);
32         [btn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
33         [btn setTitleColor:[UIColor redColor] forState:UIControlStateDisabled];
34         [btn setTitle:items[i] forState:UIControlStateNormal];
35         btn.titleLabel.font = [UIFont systemFontOfSize:14];
36         btn.tag = i; // 给按钮添加绑定tag
37         [btn addTarget:self action:@selector(titleClick:) forControlEvents:UIControlEventTouchUpInside];
38         [titlesView addSubview:btn];
39
40         [btn layoutIfNeeded];
41
42         if (i == 0) {
43             self.selectedButton = btn;
44             btn.enabled = NO;
45             // 以后设置尺寸,先设置尺寸,再设置点
46             self.indicatorView.width = btn.titleLabel.width;
47             self.indicatorView.centerX = btn.centerX;
48         }
49     }
50 }

时间: 2024-08-26 20:26:50

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

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

一.错误分析:由于tableFooterView中的数据是通过请求服务器后得到的,tableFooterViewHeight也是根据请求过来的数据经过布局子控件而计算出来的.(注意:计算高度是在子线程中执行的),导致了给TableView设置了tableFooterView,tableFooterView的高度为0.如下图: 二.解决方案一:通过KVO监听自定义tableFooterView的高度变化 解决方案二:通过block,当自定义tableFooterView计算出高度后,才将自定义控件

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

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

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

控制台打印:Application Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file. 程序禁止了http明码的访问,系统认为不安全.可通过info.plist文件临时设置.下面给出设置的方法: 找查资料后发现,新特性要求

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

一.之前用黑苹果,编辑pod文件用一下格式 platform :ios, "8.0" pod "MJExtension" pod "MJRefresh" pod "AFNetworking" pod "SVProgressHUD" pod "SDWebImage" pod "DACircularProgress" pod "pop" 二.用虚拟机的

iOS开发中的错误整理,再一次整理通过通知中心来处理键盘,一定记得最后关闭通知中心

一.打开通知中心,监听键盘的显示与隐藏 二.最后记得将监听通知的对象移除

iOS开发中的错误整理,启动图片设置了没有效果;单独创建xib需要注意的事项;图片取消系统渲染的快捷方式

一.启动图片设置了没有效果 解决方案:缓存啊!卸了程序重新安装吧!!!!! 二.单独创建xib需要注意的事项 三.图片取消系统渲染的快捷方式

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

注意问题一:每次请求之前先将之前的请求取消                            注意问题二:请求成功之后要判断footer或者header的显示状态 首次下拉刷新,要判断是否已经全部加载,全部加载完了的话,footer要隐藏,或者显示提示,否则footer显示上拉加载更多 每次的上拉刷新,判断总数量                                                        注意问题三:控制器销毁的时候应该讲所有请求任务取消.

IOS 开发笔记-基础 UI(6)照片浏览器(控件的懒加载)

使用UIImageView.UILabel.UIButton实现一个综合小案例 功能分析 (1)点击箭头切换序号.图片.描述 (2)如果是首张图片,左边箭头不能点击 (3)如果是尾张图片,右边箭头不能点击 步骤分析 (1)搭建UI界面 (2)监听按钮点击 切换序号.图片.描述 1. 界面分析 1> 需要读取或修改的属性的控件 // 序号标签 // 图片 // 图片描述 // 左边按钮 // 右边按钮 2> 需要监听响应事件的对象,需要添加监听方法 // 左边按钮 // 右边按钮 uiimage

iOS开发中xcode错误和异常处理

在开始这个的内容之前,我想先阐明两个在很多时候被混淆的概念,那就是异常 (exception) 和错误 (error). 在 Objective-C 开发中,异常往往是由程序员的错误导致的 app 无法继续运行,比如我们向一个无法响应某个消息的 NSObject 对象发送了这个消息,会得到 NSInvalidArgumentException 的异常,并告诉我们 "unrecognized selector sent to instance":比如我们使用一个超过数组元素数量的下标来试