zoukankan      html  css  js  c++  java
  • 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 }
    View Code
  • 相关阅读:
    《Python核心编程》数字类型
    我的Android进阶之旅------&gt;Android关于Log的一个简单封装
    Flex中TabNavigator隐藏和显示选项卡
    【HDOJ 5654】 xiaoxin and his watermelon candy(离线+树状数组)
    兔子-svnserver,client搭建
    数据库事务的隔离级别简单总结
    Oracle oledb 打包并集成到程序安装包(VC ADO訪问Oracle)
    kafka分区及副本在broker的分配
    每天进步一点点——mysql——Percona XtraBackup(innobackupex)
    CodeForces 550D Regular Bridge(构造)
  • 原文地址:https://www.cnblogs.com/gchlcc/p/5487577.html
Copyright © 2011-2022 走看看