1. 程式人生 > >iOS tableview做多選避免複用導致的顯示錯亂問題

iOS tableview做多選避免複用導致的顯示錯亂問題

需求:用tableview做選擇框,選中打勾,可單選、多選、全選、全不選等。

需要在一堆複用的自定義cell中 點選一個cell 在當前cell顯示選中按鈕

如果單純的在cell裡新增Btn再在didselect方法中去修改按鈕狀態,那麼就會出現別的cell中也出現了一個選中的按鈕.

這是由於cell的複用導致的

為了避免這個情況,這裡的思路就是,

1.在cell中新增按鈕,並且為按鈕新增代理方法返回控制器

2.為cell建立一個Model ,model裡面除了常規的顯示資料外,還要預留一個Index 用來標記每個cell中的Btn.tag (這樣的好處是,即使UI中cell複用了,但是每次點選的cell中的btn.tag是唯一的)

3.為cell預留一個SelectArray陣列公共屬性,通過 [tbaleView reloadData];方法來設定按鈕狀態

cell的程式碼:

#import <UIKit/UIKit.h>
#import "UserModel.h"
@protocol ReportUsersCellDelegate<NSObject>

- (void)didSelectCell:(UITableViewCell *)cell withIsSelect:(BOOL)isSelect;

@end

@interface ReportUsersCell : UITableViewCell
@property (strong, nonatomic)UserModel *model;
@property (weak, nonatomic)id<ReportUsersCellDelegate>delegate;
@property (weak, nonatomic) IBOutlet UIButton *checkBtn;
@property (weak, nonatomic) IBOutlet UILabel *userLB;
@end

#import "ReportUsersCell.h"

@implementation ReportUsersCell

- (void)awakeFromNib {
    [super awakeFromNib];
    // Initialization code
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}
- (void)setModel:(UserModel *)model{
    
    _model = model;
    
    self.userLB.text = _model.userName;
    
    if (_model.isSelect==NO) {
        
        self.checkBtn.selected = NO;
        [self.checkBtn setImage:[UIImage imageNamed:@"square_off"] forState:UIControlStateNormal];
    }else{
        [self.checkBtn setImage:[UIImage imageNamed:@"square_on"] forState:UIControlStateNormal];
        self.checkBtn.selected = YES;
    }
}

model的程式碼:

#import <Foundation/Foundation.h>

@interface UserModel : NSObject

@property (nonatomic, copy) NSString *userName;
@property (nonatomic, copy) NSString *userCode;
@property (nonatomic, assign) NSInteger index;
@property (nonatomic, assign) BOOL isSelect;
- (instancetype)initWithDict:(NSDictionary *)dict;
@end
#import "UserModel.h"

@implementation UserModel
- (instancetype)initWithDict:(NSDictionary *)dict
{
    if(self = [super init])
    {
        [self setValuesForKeysWithDictionary:dict];
    }
    return self;
}
@end

controller的程式碼:

- (void)loadData
{
    
    NSString *usercode = [JSLDefaults objectForKey:@"usercode"];
    if (usercode==nil||usercode.length==0) {
        return;
    }
    NSDictionary *parameters = @{@"userCode":usercode};
    NSData *data=[NSJSONSerialization dataWithJSONObject:parameters options:NSJSONWritingPrettyPrinted error:nil];
    NSString *jsonStr=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
    NSString *paraStr = [NSString stringWithFormat:@"%@?json=%@",[GlobalPort UsersList],jsonStr];
    NSString *utf = [paraStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    WBREQUEST.url(utf).requestType(WBRequestPost).success(^(NSURLSessionDataTask * task,id responseObject){
        
        NSArray * data = (NSArray *)responseObject;
        //        NSLog(@"一級選單=%@",data);
        self.dataArray = [NSMutableArray array];
        for (NSDictionary *dic in data) {
            
            UserModel *model = [[UserModel alloc] initWithDict:dic];
            model.isSelect = 0;
            [self.dataArray addObject:model];
            
        }
        [self.mainTableView reloadData];
        
    }).failure(^(NSURLSessionDataTask * task,id responseObject){
        
        self.HUD = [[MBProgressHUD alloc] initWithView:self.view];
        [self.HUD setMode:MBProgressHUDModeText];
        [self.view addSubview:self.HUD];
        self.HUD.labelText = @"系統繁忙,請稍後再試";
        [self.HUD showAnimated:YES whileExecutingBlock:^{
            sleep(1);
        } completionBlock:^{
            [self.HUD removeFromSuperview];
            self.HUD = nil;
            
        }];
    }).startRequest();
    [self.mainTableView.mj_header endRefreshing];
    
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    ReportUsersCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ReportUsersCell" forIndexPath:indexPath];
//    cell.userLB.text = [NSString stringWithFormat:@"%@",self.dataArray[indexPath.row][@"userName"]];
    [cell.checkBtn addTarget:self action:@selector(checkBtnClicked:) forControlEvents:UIControlEventTouchUpInside];
    cell.checkBtn.tag = indexPath.row+10;
    cell.model = self.dataArray[indexPath.row];
    cell.delegate = self;
    
    return cell;
}

#pragma mark - 全選
- (IBAction)allCheckBtnClicked:(UIButton *)sender {
    sender.selected = !sender.selected;
    if (sender.selected) {
        [sender setImage:[UIImage imageNamed:@"square_on"] forState:UIControlStateNormal];
        [self.selectedArray removeAllObjects];
        self.selectedArray = [NSMutableArray arrayWithArray:self.dataArray];
        for (int i = 0; i <self.dataArray.count; i ++) {
            UserModel *model = self.dataArray[i];
            model.isSelect = 1;
        }
        
    }else{
        [sender setImage:[UIImage imageNamed:@"square_off"] forState:UIControlStateNormal];
        [self.selectedArray removeAllObjects];
        for (int i = 0; i <self.dataArray.count; i ++) {
            UserModel *model = self.dataArray[i];
            model.isSelect = 0;
        }
    }
    [self.mainTableView reloadData];
}
#pragma mark - 單選
- (void)checkBtnClicked:(UIButton *)sender
{
    UIButton *btn = (UIButton *)[self.view viewWithTag:sender.tag];
    btn.selected = !btn.selected;
    if (btn.selected) {
        [self.selectedArray addObject:self.dataArray[sender.tag-10]];
        UserModel *model = self.dataArray[sender.tag-10];
        model.isSelect = 1;
    }else{
        [self.selectedArray removeObject:self.dataArray[sender.tag-10]];
        UserModel *model = self.dataArray[sender.tag-10];
        model.isSelect = 0;
    }
    [self.mainTableView reloadData];
}
#pragma mark - reportcell delegate
- (void)didSelectCell:(UITableViewCell *)cell withIsSelect:(BOOL)isSelect
{
    
}



相關推薦

iOS tableview避免導致顯示錯亂問題

需求:用tableview做選擇框,選中打勾,可單選、多選、全選、全不選等。需要在一堆複用的自定義cell中 點選一個cell 在當前cell顯示選中按鈕如果單純的在cell裡新增Btn再在didselect方法中去修改按鈕狀態,那麼就會出現別的cell中也出現了一個選中的按

iOS cell修正應該標記model裡是否選中

// //  AddTeamMeberViewController.m //  HengTaiXinGolf // //  Created by 歐陽榮 on 16/4/21. //  C

iOS tableview cell (批量邀請好友)

// //  AddTeamMeberViewController.h //  HengTaiXinGolf // //  Created by 歐陽榮 on 16/4/21. //  C

recycleview導致資料錯亂解決的3種方法

這是網上貼上的一張圖片1.第一種簡單粗暴,直接在viewholder設定如下程式碼即可,但效能可能大打折扣innerFragmentMyOderByViewHolder.setIsRecyclable(false);2.第二種,推薦使用,在需要使用的viewholder 中對

ListView導致圖片錯亂及閃爍問題

關於ViewHolder複用,我就不說明了,關鍵是複用導致出現的問題 網路的好壞,我們請求的圖片並不是很穩定,那麼我們假設一屏可以顯示6條資料,利用複用,我們的第7條資料view就是我們的第1條資料view,隨之手勢不斷的滑動,複用的問題,就出現,特別是上

RecyclerView的導致混亂

先看圖 點選第一條和第二條,後面的第24條和25條也被選上了。這個問題是recyclerview的item複用導致的。具體原因我正在看,解決辦法如下。 首先,主頁面的佈局就只有一個recyclerview。 <?xml version="1.

iOS本地照片的實現

-s 問題: tail 滾動 英文 返回 library ans cal 提示:iOS8須要更改一處代碼。即設置scrollview滾動究竟部那塊代碼。大家可去掉再執行源代碼 自己寫起來還是蠻費事的!本來打算使用網上流傳非常久的ELCImagePickerControl

iOS UITableView的

package lin 的人 right show 獲取 fan 技術 ews 一些列表經常需要編輯多選的功能,而UITableview自帶多選刪除的功能,使用起來方便,不需要自己去做數據存儲和選中狀態轉換,可以減少不少開發時間。下面就來介紹下UITableView多選的

時間觸發嵌入式系統設計模式 第21章 筆記 LED顯示

時間觸發嵌入式系統設計模式 第21章 筆記 多路複用LED顯示 1111 4個 8位的 數碼管 前兩個顯示小時,後兩個顯示分鐘,不顯示秒 程式碼: unsigned char LED_Table_G[20] = // 0 1 2 3

lodash元件

新建立: multiplyChooser.vue <li v-for="(item, index) in selections" @click=“toggleSelection(index)” :title=“item.label” :class="{

複雜ListView的條目型別

複雜ListVIew的多條目型別複用 即adapter、VIewHolder配合使用 · DefaultAdapter.java public abstract class DefaultAdapter<Data> extends Ba

select路IO

多路IO轉接伺服器也叫做多工IO伺服器。該類伺服器實現的主旨思想是,不再由應用程式自己監視客戶端連線,取而代之由核心替應用程式監視檔案。主要使用的方法有三種:select、poll、epoll,這次介紹一下select。 select函式原形: int select (in

iOS開啟相簿、圖片瀏覽器、圖片裁剪

資源類 PHPhotoLibrary 是一個資源庫。能夠獲取相簿許可權以及對相簿的操作,與AL不同,它不能獲取資源物件哦. PHFetchResult 是一個結果集,一個泛型類。通過方法獲取到的相簿或者資源組就是被封裝成該類返回. PHAssetCollecti

iOS UICollectionView 實現及取消

1、首先需要實現這個方法 _resourceCollectionView.allowsMultipleSelection = YES;//實現多選必須實現這個方法2、 2、然後實現以下兩個方法即可 - (void)collectionView:(UICollect

iOS 高效靈活地配置可檢視元件的主題

  本文首發於 [Ficow Shen's Blog](https://ficow.cn),原文地址: [iOS 高效靈活地配置可複用檢視元件的主題](https://blog.ficow.cn/post/19)。   ## 內容概覽 - 前言 - 如何配置主題? - 如何更高效地配

ListView 導致 CheckBox 選中狀態錯亂

在ListView巢狀CheckBox 等一些有標記的View時,如果不做處理,在ListView 滑動的時候, 會造成View的選中狀態錯亂。 比如: 可以看到 剛開始選中了demo2 和demo3。滑動到下一頁的時候,demo10 和demo11 也被選中。 當然要解決

解決RecyclerView導致圖片錯位的問題

繼上一篇部落格之後我發現在百度搜索排名第二條,想想還有些小激動呢。咳咳咳~~~,廢話少說,趕緊把我遇到的一個問題記錄下來,以便別人採坑或者自己在採坑。 問題描述:從服務端拿到一個type來展示來展示本地不同type的圖片,但是我發現了一個錯位問題,程式碼如下: switc

cocos creator 節點,高亮顯示

可用於鬥地主選牌 程式碼塊 cc.Class({ extends: cc.Component, properties: { poker:{ default:null,

iOS UITextView自適應高度貼上大量文字導致顯示不全問題處理

對UITextView做了輸入自適應高度處理,在貼上大量文字時出現了高度可自適應但文字顯示不全的問題,檢視圖層發現_UITextContainerView顯示的高度和實際高度不同,在自適應高度程式碼後新增下面程式碼,問題得到處理。 [textView sc

Java執行緒程式設計-(7)-使用執行緒池實現執行緒的和一些坑的避免

原文出自 : https://blog.csdn.net/xlgen157387/article/details/78253096 執行緒複用:執行緒池 首先舉個例子: 假設這裡有一個系統,大概每秒需要處理5萬條資料,這5萬條資料為一個批次,而這沒秒傳送的5萬條資料