UITableView表格 UIlabel疊加 UIbutton點選 複用的問題
阿新 • • 發佈:2019-02-08
很多朋友覺得UITableViewCell複用問題很難處理,百思不得其解,甚至有很多朋友自己琢磨很久也不明白個究竟。現在分享一下個人的一些經驗,希望對大家有幫助, 如果有好的意見或者有不同的看法也可以提出來,讓我們一起分享一起進步,知識只有在分享的情況下才能實現它的最大價值。好了,廢話少說,直奔主題了。列舉兩個場景 對比一下,也許tableviewcell的複用就很清晰明瞭了。 例1: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *CellIdentifier = @"cell1"; UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; UILabel *labelTest = [UILabel alloc]init]; [labelTest setFrame:CGRectMake(2, 2, 80, 40)]; [labelTest setBackgroundColor:[UIColor clearColor]; [labelTest setTag:1]; [cell contentView]addSubview:labelTest]; } UILabel *label1 = (UILabel*)[cell viewWithTag:1]; [label1 setText:[self.tests objectAtIndex:indexPath.row]; return cell; } 例2: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{ static NSString *CellIdentifier = @"cell1"; UITableViewCell *cell =[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } UILabel *labelTest = [UILabel alloc]init]; [labelTest setFrame:CGRectMake(2, 2, 80, 40)]; [labelTest setBackgroundColor:[UIColor clearColor]; //之所以這裡背景設為透明,就是為了後面讓大家看到cell上疊加的label。 [labelTest setTag:1]; [cell contentView]addSubview:labelTest]; [labelTest setText:[self.tests objectAtIndex:indexPath.row]; return cell; } 當你上下來回滑動tableview的時候就會看到區別,第一種程式介面不會出現異常,但是第二種就不是了,會出現字型疊加現象,其實更確切的是多個label的疊加。為什 麼呢,因為在tableview重新整理的時候,如果那個位置已經有現成的cell,它就不會再重新請求資源生成新的cell了,而是複用原來的cell。所以對於對於第一種,程式碼的思路 是第一次在cell不存在的時候生成cell,定義cell樣式,以後不管是重新整理還是重新請求還好,它都只是複用已生成的cell。而第二種思路是,在cell不存在的時候,請求生成 cell,然後給cell上新增label,重新整理的時候,會複用已有的cell,但是會重複新增label,故造成重疊的現象。 二 .UIbutton
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
中進行獲取這個tag值,獲取方法是:
UIButton *exitBtn = (UIButton *)[cell viewWithTag:1];//1是我上面設定的tag值
這樣就獲取到了,你再給他新增action事件就可以了,