標籤:
:紅色框中是個自訂的導航工具條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; // 給按鈕添加綁定tag37 [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
iOS開發中的錯誤整理,關於用綁定Tag取控制項的注意事項,有時候不綁定也是個錯!