/*************************** TableViewController ***************************/
1.UITableViewController继承自UIViewController, 自带一个tableView
2.self.view不是UIView, 而是UITableView
3.datasource和delegate默认都是self(UITableViewController)
4.开发中只需要建立UITableViewController子类
/******************************************************/
#import "ViewController.h"
//签订协议
@interface ViewController ()<UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong)UITableView *tableView;
@property (nonatomic, strong)NSMutableArray *dataArr;
@property (nonatomic, strong)NSMutableArray *indexArr;//右侧索引数组
@property (nonatomic, strong)NSMutableArray *titleArr;//标题数组
@end
static NSString *reuseIdentifier = @"reuseIdentifier";
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor = [UIColor whiteColor];
//载入数据
[self loadData];
//新建tableView
self.tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
//指定协议代理人
self.tableView.delegate = self;
self.tableView.dataSource = self;
[self.view addSubview:self.tableView];//添加tableView
//给tableView注册cell
// [UITableViewCell class] 获取UITableViewCell类
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:reuseIdentifier];
//设置成编辑按钮
self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
//实现协议方法
//返回分区下的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
NSMutableArray *arr = [self.dataArr objectAtIndex:section];
return arr.count;
}
//返回行下的cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: reuseIdentifier forIndexPath:indexPath];
cell.textLabel.text = [self.dataArr objectAtIndex:indexPath.section] [indexPath.row];
return cell;
}
//设置分区个数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return self.dataArr.count;
}
//设置页眉标题
//- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
// return self.titleArr[section];
//}
//设置分区头View
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
UILabel *label = [[UILabel alloc]init];
label.backgroundColor = [UIColor lightGrayColor];
label.text = [NSString stringWithFormat:@" %@", self.titleArr[section]];
return label;
}
//设置页眉高度: UITableViewStylePlain类型时, 需要设置
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 40;
}
/*************************** TableView 的编辑 ***************************/
#pragma mark--编辑第一步: 让tableView处于编辑状态
- (void)setEditing:(BOOL)editing animated:(BOOL)animated{
//1.
[super setEditing:editing animated:animated];
//2.
[self.tableView setEditing:editing animated:animated];
}
#pragma mark--编辑第二步: 指定哪一行可以编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
return YES;
}
#pragma mark--编辑第三步: 指定tableView编辑样式(默认是删除)
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
if (indexPath.row == 2) {
// return UITableViewCellEditingStyleInsert;//插入样式(一般不用)
}
return UITableViewCellEditingStyleDelete;
}
#pragma maek--编辑第四步: 提交编辑
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
//判断样式是否为删除样式
if (editingStyle == UITableViewCellEditingStyleDelete) {
//1.先删除数据源
NSMutableArray *arr = [self.dataArr objectAtIndex:indexPath.section];
//数组中删除对应的元素
[arr removeObjectAtIndex:indexPath.row];//利用索引
// 源数组中删除对应的数据(名字相同, 用str会崩溃)
//地址相同, 常量字符串
// NSString *str1 = @"getter";
// NSString *str2 = @"getter";
//2.再删除UI(cell)
[self.tableView beginUpdates];//代码块, 将更新UI的代码写在中间
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
//删除完以后判断该分区是否为空, 若为空删除该分区
if (arr.count == 0) {//数组元素是否为0
//1.删除数据源
[self.dataArr removeObjectAtIndex:indexPath.section];
//删除右侧索引
[self.indexArr removeObjectAtIndex:indexPath.section];
//2.删除UI
[self.tableView beginUpdates];
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationRight];
[self.tableView endUpdates];
}
//附:
// [self.tableView reloadData];//重新执行协议代码
// self.tableView reloadRowsAtIndexPaths:(nonnull NSArray<NSIndexPath *> *) withRowAnimation: //reloadRow
// self.tableView reloadSections:(nonnull NSIndexSet *) withRowAnimation:(UITableViewRowAnimation) //reloadSection
}
}
/*************************** End ***************************/
//右侧索引
- (NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView{
return self.indexArr;
}
//加载数据
- (void)loadData{
NSMutableArray *arr1 = [NSMutableArray arrayWithObjects:@"¥hhh, .$",@" ¥Chin ese ",@"开源中国",@"www.oschina.net", @"开源技术", nil];
NSMutableArray *arr2 = [NSMutableArray arrayWithObjects:@"社区", @"开发者", @"传播", @"2013", @"100", @"中国", @"暑假作业",@"键盘", @"鼠标",@"hello",@"world", nil];
self.indexArr = [NSMutableArray arrayWithObjects:@"1", @"2", nil];
self.dataArr = [NSMutableArray arrayWithObjects:arr1, arr2, nil];
self.titleArr = @[@"iOS", @"Android"].mutableCopy;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end