#import "AppDelegate.h"
#import "RootViewController.h"
#import "TwoViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// RootViewController *rootVC = [[RootViewController alloc]init];
// UINavigationController *navC = [[UINavigationController alloc]initWithRootViewController:rootVC];
// self.window.rootViewController = navC;
//-----------------------------------------------------------------------
TwoViewController *twoVC = [[TwoViewController alloc]init];
UINavigationController *navC = [[UINavigationController alloc]initWithRootViewController:twoVC];
self.window.rootViewController = navC;
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
#import "RootViewController.h"
@interface RootViewController ()<UITableViewDataSource,UITableViewDelegate> //它继承了scrollView的协议方法,可以直接使用。
@property(nonatomic,assign)int index; //创建单元格的个数
@end
@implementation RootViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationItem.title = @"表视图";
self.navigationController.navigationBar.barTintColor = [UIColor redColor];
//标示图的初始化
UITableView *myTableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStyleGrouped];//后面的style是让分区标题跟着移动
//将表视图添加到当前视图上
[self.view addSubview:myTableView];
//表视图所有的操作都需要代理方法来协助完成。比较特殊的是,表视图的代理方法有两个,一个更偏重于外观的设置,一个偏重于数据的设置
myTableView.delegate = self; //偏重外观
myTableView.dataSource = self; //偏重属性
//tableView的属性
//分割线的颜色
myTableView.separatorColor = [UIColor cyanColor];
//分割线的样式
myTableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
//统一设置单元格高度
myTableView.rowHeight = 50;
//设置选中效果(单元格的属性)
//给延展中的index赋值
self.index = 0;
//注册单元格
//第一个参数为你所使用的单元格的类型
//第二个参数是单元格的重用标示符
[myTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"CELL"];
}
#pragma mark - 表视图的代理方法
//返回视图中分区的个数(此代理方法不是必须实现的,如果未实现此代理方法,默认只有一个分区,如果需要多个分区的时候,再实现此代理方法)
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 2;
}
//返回每个分区下的单元格的个数(必须实现的代理方法)
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 10;
}
//定制每个单元格(必须实现的代理方法)--记得每次创建的时候,使用重用机制!!!
//indePath:当前所定制的单元格所在的位置。单元格的位置由两个属性确定:一个是单元格在哪个分区下(indexPath.section),一个是单元格在分区下的哪一行(indexPath.row)
//-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// /*
//定义单元格
//系统的单元格,会提供一些子控件
UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
//为相应位置返回定制好的单元格
//判断当前单元格行的奇偶数
if (indexPath.row %2 ==0) {
cell.textLabel.text = [NSString stringWithFormat:@"我是第偶数个单元格,我在%ld分区下",indexPath.section];
}else{
cell.textLabel.text = [NSString stringWithFormat:@"我是第奇数个单元格,我在%ld分区下",indexPath.section];
}
return cell;
// */
// //cell的重用机制:
// //1.每次要创建单元格的时候,先根据重用标示符从重用队列中获取单元格,如果未获得单元格,说明目前还没有单元格完全出屏幕。那么,我们就需要初始化单元格,如果可以获取那么就直接使用。
// //2.每次表视图都会创建一屏幕的cell,当有cell出屏幕之后,就会根据重用标示符添加到对应的重用队列中,当屏幕外的cell要进入屏幕(要显示的时候),先从重用队列中获取cell,如果可以得到cell,那么就直接使用,如果cell不存在,那么就初始化cell。
// //3.当重用cell的时候,也就是从重用队列中取出的cell,系统不会帮我们将上面的子控件或者子控件上面所显示的内容清空,需要我们重新赋值。
// //先定义重用标示符
// static NSString *cellId = @"CELL";
// //每次需要使用单元格的时候,需要重用队列中获取单元格,如果重用队列中没有单元格,再初始化新的单元格
// UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
//
// //如果从重用队列中未获取cell,也就是cell对象不存在,这时候我们就需要创建初始化单元格。
// if (!cell) {//不存在的情况下
// cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellId];
// //detailTextLabel,系统提供的这些控件都是需要配合不同样式来使用
// cell.detailTextLabel.text = [NSString stringWithFormat:@"我是创建的%d个单元格",self.index++];
单元格的属性
// //设置选中的样式
// cell.selectionStyle = UITableViewCellSelectionStyleDefault;
// //设置辅助视图样式
// cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
// //设置左侧图片
// cell.imageView.image = [UIImage imageNamed:@"Two30.png"];
//
// }
//
// cell.textLabel.text = [NSString stringWithFormat:@"我是第%ld个单元格",indexPath.row];
// return cell;
//
//}
// 注册单元格之后的写法,不用判断cell是否存在,不用初始化,直接使用
//这种方式不能改变单元格的样式,只能使用默认的default
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL" forIndexPath:indexPath];
cell.textLabel.text = @"1111";
//副标题视图,在这种写法中不能体现
//cell.detailTextLabel.text = @"2222";
return cell;
}
//添加分区标题(需要在之前有分区数量的代理)
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
return @"分区标题";
}
//设置对应位置的高度(单元格的行高)
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
//是偶数的cell的高度为150,奇数cell的高度为50
// if (indexPath.row %2 == 0) { //判断单元格行数
// return 100;
// }else{
// return 50;
// }
if (indexPath.section == 0) { //判断单元格的分区
return 50;
}else{
return 200;
}
}
//设置改变页眉的高度
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 100;
}
//设置改变页脚的高度
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
return 50;
}
//索引条
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
return [NSArray arrayWithObjects:@"A", @"B",nil];
}
//点击cell之后执行的代理方法
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"我点击了%ld分区下%ld行的单元格",indexPath.section,indexPath.row);
}
#import "TwoViewController.h"
@interface TwoViewController ()<UITableViewDelegate,UITableViewDataSource>
//承载所有联系人的数组,每个联系人都是一个字典
@property(nonatomic,retain)NSMutableArray *allPersonMutableArr;
//带分区的最大容器
@property(nonatomic,retain)NSMutableDictionary *allPersonMutableDic;
@end
@implementation TwoViewController
//懒加载
-(NSMutableArray *)allPersonMutableArr{
if (!_allPersonMutableArr) {
_allPersonMutableArr = [NSMutableArray new];
}
return _allPersonMutableArr;
}
-(NSMutableDictionary *)allPersonMutableDic{
if (!_allPersonMutableDic) {
_allPersonMutableDic = [NSMutableDictionary new];
}
return _allPersonMutableDic;
}
//通讯录形式
//[数组(字典),@“A”,数组(字典),@“B”];
//联系人的数据存在一个可变字典中,每个联系人都有一个字典,将这个字典存储在一个可变数组中,然后给数组设置对应的值,放在最大的字典中,每个数组就是一个分区,通过键值对应来响应通讯录找人的功能
//带分区的假数据
-(void)createDataSection{
NSDictionary *person_1 = [[NSDictionary alloc]initWithObjectsAndKeys:@"HanOBa",@"name",@"100",@"age",@"男",@"sex",nil];
NSDictionary *person_2 = [[NSDictionary alloc]initWithObjectsAndKeys:@"Hello",@"name",@"99",@"age",@"女",@"sex",nil];
NSDictionary *person_3 = [[NSDictionary alloc]initWithObjectsAndKeys:@"World",@"name",@"98",@"age",@"男",@"sex",nil];
NSDictionary *person_4 = [[NSDictionary alloc]initWithObjectsAndKeys:@"Forever",@"name",@"97",@"age",@"男",@"sex",nil];
NSDictionary *person_5 = [[NSDictionary alloc]initWithObjectsAndKeys:@"Love",@"name",@"96",@"age",@"女",@"sex",nil];
NSDictionary *person_6 = [[NSDictionary alloc]initWithObjectsAndKeys:@"晗",@"name",@"21",@"age",@"男",@"sex",nil];
NSDictionary *person_7 = [[NSDictionary alloc]initWithObjectsAndKeys:@"艹",@"name",@"18",@"age",@"男",@"sex",nil];
NSDictionary *person_8 = [[NSDictionary alloc]initWithObjectsAndKeys:@"嘻嘻",@"name",@"60",@"age",@"女",@"sex",nil];
NSDictionary *person_9 = [[NSDictionary alloc]initWithObjectsAndKeys:@"哈哈",@"name",@"60",@"age",@"女",@"sex",nil];
NSDictionary *person_10 = [[NSDictionary alloc]initWithObjectsAndKeys:@"马勒戈壁卧槽",@"name",@"500",@"age",@"煞笔",@"sex",nil];
//创建第一个分区下的所有的联系人
NSArray *oneSectionArray = [NSArray arrayWithObjects:person_1,person_2,person_3,person_4,person_5, nil];
//创建第二个分区下所有的联系人
NSArray *twoSectionArray = [NSArray arrayWithObjects:person_6,person_7,person_8,person_9,person_10, nil];
//将分区加载到可变字典中
[self.allPersonMutableDic setObject:oneSectionArray forKey:@"A"];
[self.allPersonMutableDic setObject:twoSectionArray forKey:@"B"];
}
//制造假数据,来测试使用
-(void)creatData{
NSDictionary *person_1 = [[NSDictionary alloc]initWithObjectsAndKeys:@"HanOBa",@"name",@"100",@"age",@"男",@"sex",nil];
NSDictionary *person_2 = [[NSDictionary alloc]initWithObjectsAndKeys:@"Hello",@"name",@"99",@"age",@"女",@"sex",nil];
NSDictionary *person_3 = [[NSDictionary alloc]initWithObjectsAndKeys:@"World",@"name",@"98",@"age",@"男",@"sex",nil];
NSDictionary *person_4 = [[NSDictionary alloc]initWithObjectsAndKeys:@"Forever",@"name",@"97",@"age",@"男",@"sex",nil];
NSDictionary *person_5 = [[NSDictionary alloc]initWithObjectsAndKeys:@"Love",@"name",@"96",@"age",@"女",@"sex",nil];
NSDictionary *person_6 = [[NSDictionary alloc]initWithObjectsAndKeys:@"晗",@"name",@"21",@"age",@"男",@"sex",nil];
NSDictionary *person_7 = [[NSDictionary alloc]initWithObjectsAndKeys:@"艹",@"name",@"18",@"age",@"男",@"sex",nil];
NSDictionary *person_8 = [[NSDictionary alloc]initWithObjectsAndKeys:@"嘻嘻",@"name",@"60",@"age",@"女",@"sex",nil];
NSDictionary *person_9 = [[NSDictionary alloc]initWithObjectsAndKeys:@"哈哈",@"name",@"60",@"age",@"女",@"sex",nil];
NSDictionary *person_10 = [[NSDictionary alloc]initWithObjectsAndKeys:@"马勒戈壁卧槽",@"name",@"500",@"age",@"煞笔",@"sex",nil];
//将所有人的信息添加到可变数组中
[self.allPersonMutableArr addObject:person_1];
[self.allPersonMutableArr addObject:person_2];
[self.allPersonMutableArr addObject:person_3];
[self.allPersonMutableArr addObject:person_4];
[self.allPersonMutableArr addObject:person_5];
[self.allPersonMutableArr addObject:person_6];
[self.allPersonMutableArr addObject:person_7];
[self.allPersonMutableArr addObject:person_8];
[self.allPersonMutableArr addObject:person_9];
[self.allPersonMutableArr addObject:person_10];
}
- (void)viewDidLoad {
[super viewDidLoad];
//创建数据
//不带分区的数据
//[self creatData];
//带分区的数据
[self createDataSection];
self.navigationItem.title = @"练习";
self.navigationController.navigationBar.barTintColor = [UIColor orangeColor];
//初始化一个和屏幕宽高一样的表视图
UITableView *myTableView = [[UITableView alloc]initWithFrame:self.view.bounds];
//设置代理方法
myTableView.delegate = self;
myTableView.dataSource = self;
//将tableView添加到父视图上
[self.view addSubview:myTableView];
//注册单元格(可选)(配合创造单元格第一个方法写)
// [myTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"CELL"];
}
#pragma mark - 表视图的代理方法
//创造多少个分区的代理方法:
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
//返回所有联系人的分区(联系人存在一个可变字典中)
return self.allPersonMutableDic.count;
}
#warning 两个必须实现的代理!!!
//实现必须实现的代理方法:
//每个分区下单元格的个数的代理方法:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
// //返回每个分区下联系人的个数(这个是没有分组的假数据)
// return self.allPersonMutableArr.count;
//根据当前所在的分区,将字典中对应的小数组取出
NSArray *smallArray = [self.allPersonMutableDic.allValues objectAtIndex:section];
NSLog(@"数组%@",self.allPersonMutableDic.allValues);
return smallArray.count;
}
// //定义单元格代理方法:
//- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// UITableViewCell *myCell = [tableView dequeueReusableCellWithIdentifier:@"CELL" forIndexPath:indexPath];
//
// //先从大数组中将对应位置的联系人信息取出
// NSDictionary *personInfoDic = [self.allPersonMutableArr objectAtIndex:indexPath.row];
// //从联系人信息中将姓名取出
// NSString *nameStr = [personInfoDic objectForKey:@"name"];
//
// myCell.textLabel.text = nameStr;
// return myCell;
//}
//
//定义单元格-(不使用注册的方式,老写法)(等同于上面注释的写法)
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//创建重用标示符
static NSString *reUsedId = @"CELL";
//根据标示符从重用队列中取出cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reUsedId];
//判断cell是否存在
if (!cell) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reUsedId];
}
//以下是第一次无规律的:
// //赋值-(只能写在if判断之外,并且在if判断之后)
// //取出单个联系人的信息
// NSDictionary *personInfoDic = [self.allPersonMutableArr objectAtIndex:indexPath.row];
// //取出联系人的姓名、年龄、性别
// NSString *nameStr = [personInfoDic objectForKey:@"name"];
// NSString *ageStr = [personInfoDic objectForKey:@"age"];
// NSString *sexStr = [personInfoDic objectForKey:@"sex"];
// //显示姓名
// cell.textLabel.text = nameStr;
// //显示年龄和性别
// cell.detailTextLabel.text = [NSString stringWithFormat:@"年龄:%@ 性别:%@",ageStr,sexStr];
//
//以下是第二次:
//第一步先从字典中取出响应的小数组
NSArray *infoArray = [self.allPersonMutableDic.allValues objectAtIndex:indexPath.section];
//第二步从小数组中取出对应位置的联系人信息
NSDictionary *personInfoDic = [infoArray objectAtIndex:indexPath.row];
NSString *nameStr = [personInfoDic objectForKey:@"name"];
NSString *sexStr = [personInfoDic objectForKey:@"sex"];
NSString *ageStr = [personInfoDic objectForKey:@"age"];
cell.textLabel.text = [NSString stringWithFormat:@"姓名:%@ 年龄:%@ 性别:%@",nameStr, ageStr,sexStr];;
cell.detailTextLabel.text = [NSString stringWithFormat:@"年龄:%@ 性别:%@",ageStr,sexStr];
return cell;
}
//为每个分区添加标题
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
return [self.allPersonMutableDic.allKeys objectAtIndex:section];
}