WeekSelection

今天写项目正好写到了一个实习期让我抓狂的功能-UITableView的多选,想想还是写个Demo记录下比较好。

老规矩先上效果图:

demo

关键的知识点是UITableView的复选功能。

1.定义两个数组

1
2
3
4
5
6
7
8
9
// 用于数据源显示星期
{
NSArray *weekArray;
}

weekArray = @[@"周日",@"周一",@"周二",@"周三",@"周四",@"周五",@"周六"];

// 用于存储选中的时间段(本Demo直接通过选中的indexPath.row来进行存储)
@property (nonatomic, strong) NSMutableArray *selectedWeekArray;

2.选择的同时更改selectedWeekArray的值。点击判断selectedWeekArray是否存在点击indexPath.row的值,如果存在就删除不存在则加入。同时刷新tableView

1
2
3
4
5
6
7
8
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if ([self.selectedWeekArray containsObject:[NSString stringWithFormat:@"%ld",indexPath.row]]) {
[self.selectedWeekArray removeObject:[NSString stringWithFormat:@"%ld",indexPath.row]];
} else {
[self.selectedWeekArray addObject:[NSString stringWithFormat:@"%ld",indexPath.row]];
}
[tableView reloadData];
}

3.刷新tableView的同时判断当前的selectedWeekArray中存的值用来判断哪些Cell需要勾选。

  • 在- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;方法中实现
1
2
3
4
5
if ([self.selectedWeekArray containsObject:[NSString stringWithFormat:@"%ld",indexPath.row]]) {
cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
cell.accessoryType = UITableViewCellAccessoryNone;
}

如此既能实现点击勾选再次点击取消并且是多选功能。

4.返回传值和push传值。

  • 返回传值使用的是delegate(也可使用NSNotificationCenter、block、单例等来实现)
1
2
3
4
5
6
7
8
// 自定义代理
@protocol WeekSelectedDelegate <NSObject>

- (void)selectedWeek:(NSMutableArray *)mutableArray;

@end

@property (nonatomic, weak) id<WeekSelectedDelegate> delegate;
1
2
3
4
5
6
7
// 设置代理是在导航栏的确定键中
- (void)submit {
if ([self respondsToSelector:@selector(tableView:didSelectRowAtIndexPath:)]) {
[self.delegate selectedWeek:self.selectedWeekArray];
}
[self.navigationController popViewControllerAnimated:true];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
- (void)selectedWeek:(NSMutableArray *)mutableArray {
// weekContentArray 用于存储要在weekLab中显示的值
weekContentArray = [NSMutableArray array];
// 把mutableArray赋值给selectArray 用于跳转到星期选择页面勾选内容的显示(第5点讲解)
selectArray = [NSMutableArray array];
selectArray = mutableArray;
// 通过for循环判断返回的值包含哪些(有更简洁的方法还望指教!)
for (int i = 0; i < 7; i++) {
if ([mutableArray containsObject:[NSString stringWithFormat:@"%d",i]]) {
if (i == 0) {
[weekContentArray addObject:@"周日"];
} else if (i == 1) {
[weekContentArray addObject:@"周一"];
} else if (i == 2) {
[weekContentArray addObject:@"周二"];
} else if (i == 3) {
[weekContentArray addObject:@"周三"];
} else if (i == 4) {
[weekContentArray addObject:@"周四"];
} else if (i == 5) {
[weekContentArray addObject:@"周五"];
} else if (i == 6) {
[weekContentArray addObject:@"周六"];
}
}
}

// 此处做个内容判断选择的天数不同 显示的内容不同
if (weekContentArray.count == 7) {
weekLab.text = @"每天";
} else {
weekLab.text = [weekContentArray componentsJoinedByString:@","];
}
}

5.再次跳转勾选显示

  • selectedWeekArray有值说明之前就有勾选过内容,并且赋值给selectedWeekArray。selectedWeekArray在cellForRowAtIndexPath方法中再次进行判断哪些行需要勾选,这样就实现了保留上一次勾选的内容
1
2
3
if (selectArray.count > 0) {
week.selectedWeekArray = selectArray;
}
  • 当selectArray没有值是 selectedWeekArray进行初始化
1
2
3
if (self.selectedWeekArray.count == 0) {
self.selectedWeekArray = [NSMutableArray array];
}
  • 有误或则不足之处不吝赐教!(QQ:1402832352)