UITableView及简单通讯录功能

import "AppDelegate.h"

import "RootViewController.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

  • (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    RootViewController *rootVC = [[RootViewController alloc]init];
    UINavigationController *navC = [[UINavigationController alloc]initWithRootViewController:rootVC];
    [self.window setRootViewController:navC];

    return YES;
    }


import "RootViewController.h"

@interface RootViewController ()<UITableViewDataSource,UITableViewDelegate>

@property (nonatomic ,retain)NSArray *dataArray; // 数据源,用来给cell赋值
@property (nonatomic ,retain)NSDictionary *dict;
@property (nonatomic ,retain)NSMutableArray *titleArray; // 用来盛放头标题

@end

@implementation RootViewController

  • (void)viewDidLoad {
    [super viewDidLoad];
    // 初始化数据源并且添加数据
    self.dataArray = [NSArray arrayWithObjects:@"A",@"B",@"C",@"D",@"E",@"F",@"G",@"H",@"I",@"J", nil];

    NSArray *arr = [NSArray arrayWithObjects:@"G",@"E",@"F",@"G",@"H", nil];
    self.dict = [NSDictionary dictionaryWithObjectsAndKeys:_dataArray,@"0",arr,@"1", nil];

    // 添加头标题
    self.titleArray = [NSMutableArray array];
    for (NSArray *arrayItem in self.dict.allValues) {
    // 从数组中取出第一个元素
    // 判断字典中的元素是否存在,如果存在它的类型是否为数组 且存在数组元素(不为空)
    if (arrayItem && [arrayItem isKindOfClass:[NSArray class]] && arrayItem.count) {
    NSString *nameStr = [arrayItem objectAtIndex:0];
    // 判断数组中的元素是否存在,如果存在类型是否为字符串,如果为字符串类型,判断字符串长度是否为零
    if (nameStr && [nameStr isKindOfClass:[NSString class]] && nameStr.length) {
    // 截取字符串的首个字符
    NSString *resultStr = [nameStr substringToIndex:1];
    // 将首个字符串添加进数组
    [self.titleArray addObject:resultStr];
    }
    }
    }

    self.navigationItem.title = @"RootVC";
    // 创建表视图
    // 设置分割线样式 style:设置单元格样式,有两种样式:plain(平铺) group ,默认样式为:plain
    UITableView *tableView = [[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStyleGrouped];
    // 设置分割线样式
    tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
    // 设置分割线颜色
    tableView.separatorColor = [UIColor orangeColor];
    // 如果我们每个的cell的高度是统一的,可以直接用属性来设置
    tableView.rowHeight = 60;

    tableView.dataSource = self;
    tableView.delegate = self;
    [self.view addSubview:tableView];
    }

pragma mark --- 表视图的代理方法

// 共有多少个分区 此代理方法为可选的,如果不实现该代理方法,默认整个表视图只有一个分区
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
// return 1;
// 返回字典中元素的个数,作为分区的个数
return self.dict.count;
}

// 每个分区下返回的行数
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
// return 10;
// 这里单元格个数一般不写死,将数据源的个数作为返回值,根据数据的数量创建单元格的数量
// return self.dataArray.count;// 返回所有数据的个数
// 根据当前所在的分区,取得字典中对应的键
// NSString *keyString = self.dict.allKeys[section];
// // 根据键取出对应的值,由于字典的值为数组,所以可以有count属性
// return [self.dict[keyString] count];

//  根据所在分区取出字典的值
NSArray *array = [self.dict.allValues objectAtIndex:section];
return array.count;

}

// 定义单元格 IndexPath:单元格当前所在位置
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

static NSString *identifier = @"cell";
//  identifier: 因为一个表视图中可能存在多种样式的单元格,我们把相同样式的单元格放到同一个集合里面,为这个集合加标示符,当我们需要用到某种样式的单元格的时候,根据不同的标示符,从不同的集合中找寻单元格
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];//  在某个标示符下,可以再度被移出重新使用的cell

// � 如果从集合中为找到单元格,也就是集合中好没有单元格,也就是还没有单元格出屏幕,那么我们需要创建单元格
if (!cell) {
// 创建cell的时候需要标示符是因为,当该cell出屏幕的时候将单元格按照不同类型放入和集中
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];

    //  设置cell的Style,不涉及到数据的重新赋值,我们可以在初始化cell的时候给它设置好
    //  设置辅助视图
    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
    //  设置选中后的效果
    cell.selectionStyle = UITableViewCellSelectionStyleDefault;
}

//  创建单元格

// UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

//  为cell上添加文字      indexPath.row : 单元格所在的行数

// cell.textLabel.text = [NSString stringWithFormat:@"我是第%ld个单元格,我在%ld分区",(long)indexPath.row+1,indexPath.section];
// indexPath.row是得到当前单元格所在的那一行,起始位置为0,数组下标的起始位置也是零,所以我们可以根据单元格所在的行数来从数组中取值显示
// cell.textLabel.text = [self.dataArray objectAtIndex:indexPath.row];

// NSString *keyString = self.dict.allKeys[indexPath.section];
// NSArray *array = self.dict[keyString];
NSArray *valueArray = [self.dict.allValues objectAtIndex:indexPath.section];

cell.textLabel.text = [valueArray objectAtIndex:indexPath.row];

//  副标题  这种样式只能在非default的样式下使用,只为显示位置有所改变
cell.detailTextLabel.text = @"副标题,颜色浅色";
//  不管任何Style样式下,都给可以给cell添加图片
cell.imageView.image = [UIImage imageNamed:@"11"];

return cell;
}

// 为每个分区头添加标题的代理方法
-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
// 为每个分区添加头标题
// NSArray *titArray = [NSArray arrayWithObjects:@"1",@"2", nil];
// return [titArray objectAtIndex:section];

// NSString *string = [[self.dict.allValues objectAtIndex:section] objectAtIndex:0];
// NSString *subStr = [string substringToIndex:1];
// return subStr;

int index = (int)(self.titleArray.count > section ? section : -1);
if (index != -1) {
    return [self.titleArray objectAtIndex:section];
}else
    return @"数组元素不够了";

}

//� 点击cell所响应的代理方法
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
// 根据indexPath得到当前所点击的cell
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
NSLog(@"------%ld",(long)indexPath.row);
}

// 通过代理设置cell的高度
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

//  一般cell都需要根据内容来自适应高度,高度的变化就在此处根据indexPath来更改(每个cell的高度不统一)
//  设置第一个cell高度200,其他都是100
if (indexPath.row == 0) {
    return 100;
}
return 60;

}

// 添加右侧索引条的代理方法
-(NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView{
return [NSArray arrayWithObjects:@"a",@"b",@"c",@"d", nil];
}

  • (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    }
    @end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容