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萬條資料