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 }

效果如下:

主要代码

 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

时间: 2024-12-22 06:44:02

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

反选,全选,删除按钮的实现

阅读目录 1.反选按钮 2.全选\全不选按钮 3.删除按钮 4.其他代码实现 还是在上一个程序的基础上进行修改 1.反选按钮 2.全选按钮 3.删除按钮 4.其他代码优化 回到顶部 1.反选按钮 反选的过程就是将_deleteShops数组中得数据清空,然后将Shops中数组添加到_deleteShops数组 添加一个 UIBarButtonItem 按钮,绑定响应事件. 代码如下 1 // 反选 2 - (void)unSelected 3 { 4 // 1.记录shops数组的长度和_del

IOS开发学习笔记-(2)键盘控制,键盘类型设置,alert 对话框

一.关闭键盘,放弃第一响应者,处理思路有两种 ① 使用文本框的 Did End on Exit 绑定事件 ② UIControl on Touch 事件 都去操作 sender 的  resignFirstResponder #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UITextField *txtUserName; @pro

iOS开发学习笔记:基础篇

iOS开发需要一台Mac电脑.Xcode以及iOS SDK.因为苹果设备都具有自己封闭的环境,所以iOS程序的开发必须在Mac设备上完成(当然,黑苹果应该也是可以的,但就需要花很多的精力去折腾基础环境),Xcode是一个集成开发环境,包括了编辑器.调试.模拟器等等一系列方便开发和部署的工具,iOS SDK则是开发应用所必需,不同的SDK分别对应不同的iOS版本或设备,通常我们需要下载多个iOS SDK以确保我们开发的程序能够在不同版本的iOS上正常运行. 创建新工程 Xcode提供了很多种工程模

IOS开发学习笔记-(3) 进度条、等待动画开始停止

一.创建对应空间视图  ,如下图: 二.编写对应的 .h 代码,如下 : #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activWaitNetWork; @property (weak, nonatomic) IBOutlet UIProgressView *pgrsDownLo

IOS开发学习笔记(二)-语音识别(科大讯飞)

上次简单地讲解了如何利用科大讯飞完成语音合成,今天接着也把语音识别整理一下.当然,写代码前我们需要做的一些工作(如申请appid.导库),在上一篇语音合成的文章当中已经说过了,不了解的可以看看我上次的博文,那么这次直接从堆代码开始吧. 详细步骤: 1.导完类库之后,在工程里添加好用的头文件.在视图里只用了一个UITextField显示识别的内容,两个UIButton(一个开始监听语音,一个结束监听),然后引入类.添加代理,和语音合成的一样. MainViewController.h 1 #imp

IOS开发学习笔记(1)-----UILabel 详解

1. [代码][C/C++]代码     //创建uilabelUILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 280, 80)];//设置背景色label1.backgroundColor = [UIColor grayColor];//设置taglabel1.tag = 91;//设置标签文本label1.text = @"Hello world!";//设置标签文本字体和字体大小label1.

IOS开发学习笔记(2)-----UIButton 详解

1. [代码][C/C++]代码     //这里创建一个圆角矩形的按钮    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];    //    能够定义的button类型有以下6种,//    typedef enum {//        UIButtonTypeCustom = 0,          自定义风格//        UIButtonTypeRoundedRect,        

IOS开发学习笔记--语音合成(科大讯飞)

      现在语音服务越来越热,我们平时使用的很多软件都带有语音合成和识别功能,用起来也很方便.说到语音服务,Google和微软都提供过API接口,不过笔者要介绍的是国内的智能语音技术提供商---科大讯飞.之前看过一个比较Google.微软和科大讯飞语音识别引擎的博文(http://fqctyj.blog.163.com/blog/static/70843455201361955322797/),有兴趣可以去看看.笔者接触语音服务的时间也不长,对语音服务也不是很了解,但是拆解过科大讯飞的Dem

ios开发学习笔记(这里一定有你想要的东西,全部免费)

1,Search Bar 怎样去掉背景的颜色(storyboard里只能设置background颜色,可是发现clear Color无法使用). 其实在代码里还是可以设置的,那就是删除背景view [[self.searchBar.subviews objectAtIndex:0] removeFromSuperview]; 2,NSDate: [java] view plaincopy 字母  日期或时间元素    表示     示例 G     Era   标志符     Text