转载

IOS开发学习笔记029-反选、全选、删除按钮的实现

还是在上一个程序的基础上进行修改

1、反选按钮

2、全选按钮

3、删除按钮

4、其他代码优化

1、反选按钮

反选的过程就是将_deleteShops数组中得数据清空,然后将Shops中数组添加到_deleteShops数组

添加一个 UIBarButtonItem 按钮,绑定响应事件.

代码如下

 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 }

2、全选/全不选按钮

全选/全不选按钮的实现主要在_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 }

3、删除按钮

_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 }

4、其他代码实现

在上述按钮按下的过程中会有几个控件的状态改变,删除按钮状态、选中行数量(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 }

效果如下:

IOS开发学习笔记029-反选、全选、删除按钮的实现

主要代码

 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 

正文到此结束
Loading...