还是在上一个程序的基础上进行修改
反选的过程就是将_deleteShops数组中得数据清空,然后将Shops中数组添加到_deleteShops数组
1 // 反选 2 - (void)unSelected 3 { 4 // 1、记录shops数组的长度和_deleteShops的长度 5 NSInteger shopsCount = _shops.count; 6 NSInteger deleteCount = _deleteShops.count; 7 8 // 2、将数据全部添加到临时数组中,有先后顺序:shops在前,deleteshop在后 9 NSMutableArray *tmp = [NSMutableArray arrayWithArray:_shops]; 10 [tmp addObjectsFromArray:_deleteShops]; 11 12 // 3、添加数据到_deleteShops数组,取出前一部分 13 for (NSInteger i = 0 ; i < shopsCount ;i ++) 14 { 15 Shop *s = [tmp objectAtIndex:i]; 16 // 添加数据到_deleteShops数组 17 [_deleteShops addObject:s]; 18 19 } 20 // 4、将取消选中的按钮从_deleteShops数组中移除数组范围(shopsCount,)后一部分, 21 for (NSInteger i = shopsCount ; i < (shopsCount + deleteCount);i ++) 22 { 23 Shop *s = [tmp objectAtIndex:i]; 24 [_deleteShops removeObject:s]; 25 26 } 27 28 // 5、更新表格 29 [_tableView reloadData]; 30 }
全选/全不选按钮的实现主要在_deleteShops数组的数据进行增减
1 // 全选/全不选按钮 2 - (void)selectAll 3 { 4 // 1、如果一样就清空deleteShop数组 5 if(_deleteShops.count == _shops.count) 6 { 7 [_deleteShops removeAllObjects]; 8 } 9 // 2、否则就将shops数组中数据添加到deleteshops数组中 10 else 11 { 12 // 先清空deleteshop数组 13 [_deleteShops removeAllObjects]; 14 // 再添加数据 15 for (NSInteger i = 0 ; i < _shops.count ;i ++) 16 { 17 Shop *s = [_shops objectAtIndex:i]; 18 // 添加数据到_deleteShops数组 19 [_deleteShops addObject:s]; 20 21 } 22 } 23 // 3、更新表格 24 [_tableView reloadData]; 25 }
_deleteShops数组中保存的就是要删除的数据,直接从_shops数组中对数据进行删除就行
1 // 删除选中行 2 -(void)remove 3 { 4 // 1、删除行数据 5 [_shops removeObjectsInArray:_deleteShops]; 6 // 2、删除_deleteShops数组 7 [_deleteShops removeAllObjects]; 8 // 3、更新表格 9 [self.tableView reloadData]; 10 }
在上述按钮按下的过程中会有几个控件的状态改变,删除按钮状态、选中行数量(lable标签)的状态、全选按钮状态、反选按钮状态。每次都会产生数据的更改,所以每次都需要对数据界面进行刷新。
所以把这些状态的改变放到方法 numberOfRowsInSection中
1 // 设置行 2 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 3 { 4 // 因为每次选中这两个值都会同时改变,所以放在这里会更好,可以省去很多代码 5 // 更新行时判断选中cell个数显示方式,每次改变都会调用 6 _textlable.text = (_deleteShops.count == 0) ? @"淘宝" : [NSString stringWithFormat:@"淘宝(%d)",_deleteShops.count]; 7 // 删除按钮状态 8 _buttonDelete.enabled = (_deleteShops.count == 0) ? NO : YES; 9 // 反选按钮状态 10 _unSelectBtn.enabled = (_shops.count == 0) ? NO : YES; 11 // 全选按钮状态 12 _selectAllBtn.enabled = (_shops.count == 0) ? NO : YES; 13 return _shops.count; 14 15 }
效果如下:
主要代码
1 // 2 // SLQViewController.h 3 // UITableView-淘宝 4 // 5 // Created by Christian on 15/5/18. 6 // Copyright (c) 2015年 slq. All rights reserved. 7 // 8 9 #import <UIKit/UIKit.h> 10 11 @interface SLQViewController : UIViewController 12 @property (weak, nonatomic) IBOutlet UILabel *textlable; // lable标签 13 @property (weak, nonatomic) IBOutlet UIBarButtonItem *buttonDelete; // 删除按钮 14 - (IBAction)remove; // 删除事件 15 - (IBAction)unSelected; // 反选事件 16 - (IBAction)selectAll; // 全选 17 @property (weak, nonatomic) IBOutlet UITableView *tableView; // tableView 18 @property (weak, nonatomic) IBOutlet UIBarButtonItem *unSelectBtn; // 反选按钮 19 @property (weak, nonatomic) IBOutlet UIBarButtonItem *selectAllBtn; // 全选按钮 20 21 @end
1 // 2 // SLQViewController.m 3 // UITableView-淘宝 4 // 5 // Created by Christian on 15/5/18. 6 // Copyright (c) 2015年 slq. All rights reserved. 7 // 8 9 #import "SLQViewController.h" 10 #import "Shop.h" 11 @interface SLQViewController () <UITableViewDataSource, UITableViewDelegate> 12 13 14 { 15 NSMutableArray *_shops; 16 NSMutableArray *_deleteShops; 17 } 18 @end 19 20 @implementation SLQViewController 21 22 - (void)viewDidLoad 23 { 24 [super viewDidLoad]; 25 // Do any additional setup after loading the view, typically from a nib. 26 27 // 读取*.plist文件 28 // 1.获取全路径 29 NSString *path = [[NSBundle mainBundle] pathForResource:@"shops" ofType:@"plist"]; 30 // 2.读取数据到数组 31 NSArray *array = [NSArray arrayWithContentsOfFile:path]; 32 // 初始化数组 33 _shops = [NSMutableArray array]; 34 _deleteShops = [NSMutableArray array]; 35 //NSLog(@"%d",array.count); 36 // 添加数据到界面 37 for (NSDictionary *arr in array) 38 { 39 // 1.创建shop 40 Shop *s = [Shop shopWithDict:arr]; 41 // 2.添加到数组 42 [_shops addObject:s]; 43 } 44 //_buttonDelete.enabled = YES; 45 46 } 47 48 // 删除选中行 49 -(void)remove 50 { 51 // 1、删除行数据 52 [_shops removeObjectsInArray:_deleteShops]; 53 // 2、删除_deleteShops数组 54 [_deleteShops removeAllObjects]; 55 // 3、更新表格 56 [self.tableView reloadData]; 57 } 58 59 // 反选 60 - (void)unSelected 61 { 62 // 1、记录shops数组的长度和_deleteShops的长度 63 NSInteger shopsCount = _shops.count; 64 NSInteger deleteCount = _deleteShops.count; 65 66 // 2、将数据全部添加到临时数组中,有先后顺序:shops在前,deleteshop在后 67 NSMutableArray *tmp = [NSMutableArray arrayWithArray:_shops]; 68 [tmp addObjectsFromArray:_deleteShops]; 69 70 // 3、添加数据到_deleteShops数组,取出前一部分 71 for (NSInteger i = 0 ; i < shopsCount ;i ++) 72 { 73 Shop *s = [tmp objectAtIndex:i]; 74 // 添加数据到_deleteShops数组 75 [_deleteShops addObject:s]; 76 77 } 78 // 4、将取消选中的按钮从_deleteShops数组中移除数组范围(shopsCount,)后一部分, 79 for (NSInteger i = shopsCount ; i < (shopsCount + deleteCount);i ++) 80 { 81 Shop *s = [tmp objectAtIndex:i]; 82 [_deleteShops removeObject:s]; 83 84 } 85 86 // 5、更新表格 87 [_tableView reloadData]; 88 } 89 // 全选/全不选按钮 90 - (void)selectAll 91 { 92 // 1、如果一样就清空deleteShop数组 93 if(_deleteShops.count == _shops.count) 94 { 95 [_deleteShops removeAllObjects]; 96 } 97 // 2、否则就将shops数组中数据添加到deleteshops数组中 98 else 99 { 100 // 先清空deleteshop数组 101 [_deleteShops removeAllObjects]; 102 // 再添加数据 103 for (NSInteger i = 0 ; i < _shops.count ;i ++) 104 { 105 Shop *s = [_shops objectAtIndex:i]; 106 // 添加数据到_deleteShops数组 107 [_deleteShops addObject:s]; 108 109 } 110 } 111 // 3、更新表格 112 [_tableView reloadData]; 113 } 114 // 设置行 115 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 116 { 117 // 因为每次选中这两个值都会同时改变,所以放在这里会更好,可以省去很多代码 118 // 更新行时判断选中cell个数显示方式,每次改变都会调用 119 _textlable.text = (_deleteShops.count == 0) ? @"淘宝" : [NSString stringWithFormat:@"淘宝(%d)",_deleteShops.count]; 120 // 删除按钮状态 121 _buttonDelete.enabled = (_deleteShops.count == 0) ? NO : YES; 122 // 反选按钮状态 123 _unSelectBtn.enabled = (_shops.count == 0) ? NO : YES; 124 // 全选按钮状态 125 _selectAllBtn.enabled = (_shops.count == 0) ? NO : YES; 126 return _shops.count; 127 128 } 129 // 设置行内容 130 // 每当有一个cell进入视野范围内就会调用 131 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 132 { 133 static NSString *ID = @"C1"; 134 // 从缓存池中选择可循环利用的cell,指定标识c1,这样就会找到结构一样的cell 135 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; 136 // 如果缓存池中没有 137 if (cell == nil) 138 { 139 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; // 设定标识C1 140 } 141 // UITableViewCell * cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"c1"]; 142 // 更新数据到界面 143 Shop *s = _shops[indexPath.row]; 144 cell.textLabel.text = s.name; 145 cell.imageView.image = [UIImage imageNamed:s.icon];; 146 cell.detailTextLabel.text = s.desc; 147 // 显示最右侧的按钮 148 if ([_deleteShops containsObject:s]) // 判断是否已经选中的cell,是得话设置图标 149 { 150 cell.accessoryType = UITableViewCellAccessoryCheckmark; 151 } 152 else // 否则就什么都不显示 153 { 154 cell.accessoryType = UITableViewCellAccessoryNone; 155 } 156 157 // NSLog(@"%p,第%ld行数据",cell,indexPath.row); 158 159 return cell; 160 } 161 // 设置每一行的高度 162 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 163 { 164 // 165 //NSLog(@"height is 70"); 166 return 100; 167 } 168 // 选中某行执行 169 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 170 { 171 //NSLog(@"selected"); 172 //选中后颜色变深 173 // 在最右侧显示一个对号图标 174 // 1、获得选中行 175 Shop *s = _shops[indexPath.row]; 176 // 2、修改选中行的数据,将选中的cell添加到待删除数组中 177 if ([_deleteShops containsObject:s]) // 如果已经存在,再次点击就取消选中按钮 178 { 179 [_deleteShops removeObject:s]; 180 } 181 else // 否则就添加待删除数组 182 { 183 [_deleteShops addObject:s]; 184 } 185 // 3、更新数据 186 [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 187 // 4、显示选中条数 188 if(_deleteShops.count == 0) 189 { 190 _textlable.text = @"淘宝"; 191 _buttonDelete.enabled = NO; 192 } 193 else 194 { 195 _textlable.text = [NSString stringWithFormat:@"淘宝(%d)",_deleteShops.count]; 196 _buttonDelete.enabled = YES; 197 } 198 199 } 200 // 取消选中某行执行 201 - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath 202 { 203 NSLog(@"Deselected"); 204 } 205 206 207 @end
源代码: http://pan.baidu.com/s/1mgIIUEk