ios控件UITableview自己总结

如何使用UITableview,需要掌握几个要点

遵守协议

tableview所属的控制器必须遵守2个协议,一是UITableViewDataSource,数据源协议,二是UITableViewDelegate,有关代理的协议。同时,必须设置数据源对象、代理对象 。

数据源

datasource,是一个属性。任何oc类型的对象都可以成为它的数据源(必须遵守协议)。只有遵守协议才能使用自带方法。需要数据源来展示数据,一般将tableview的数据源设为控制器本身。

方法

  • 数据源方法
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

此方法告诉tableview需要设置多少个数据组。一般分为单组/多组数据,当
return值为 1或没有设置此方法时,默认组数为1,即在tableview中只设置一个组;return值n大于等于1时,表示在tableview中设置n个组。从0开始,0表示第一组

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

此方法告诉tableview对应的组有多少个数据行。需要对每组依次进行设置,return几就表示几行。
ps:当tableview要展示数据时,会自动调用数据源方法

  • 代理方法
    主要作用是监听对tableview的点击/选中事件,主要包括以下几个方法:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

告诉tableview每一行显示什么内容—— 每一行都是一个UITableViewCell或其子类,故只需要返回一个cell即可。其中的参数indexPath
indexPath.section 表示组(从0开始
indexPath.row 表示行(从0开始
另外,给cell添加数据也是在此方法体中添加。

  • 注册
    在viewDidLoad:方法中注册。要注册什么类型的cell(自定义cell?)就在参数中给出类名。
[self.mytableView registerClass:[ShopCell class] forCellReuseIdentifier:@"shopID"]

说明:使用注册的方式创建的tableView,只有textLabel一个属性,如果还需要其他控件,就需要自定义cell。

  • 非注册形式
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuse"];
 if (cell == nil) {
  cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"reuse"];
   }

说明:以上是必要声明的方法,缺一不可,这个过程是tableview展示数据的过程

  • 其他常用方法:
    返回选中的行号
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

设置每一组的组头标题

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
}

设置每一组的组尾标题

-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
}

选中/点击某行cell时会调用

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
     //设置 取消点击后选中cell
    [tableView deselectRowAtIndexPath:indexPath animated:YES];   
}

取消选中某行cell会调用 (当我选中第0行的时候,如果现在要改为选中第1行 - >会先取消选中第0行,然后调用选中第1行的操作)

-(void)tableView:(nonnull UITableView *)tableView didDeselectRowAtIndexPath:(nonnull NSIndexPath *)indexPath
{
    NSLog(@"取消选中 didDeselectRowAtIndexPath row = %ld ", indexPath.row);
}

数据源方法 cell左滑删除,并调用,进行事件处理(删除)

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
    [self.carArray removeObjectAtIndex:indexPath.row];
    [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
}

代理方法,返回左滑时,返回右边删除按钮的文字

-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{
    
    return @"删除";
}

PS:以上两个方法往往同时出现,实现左滑删除。
添加自定义的左滑出现按钮(会覆盖掉上面两个方法)

-(NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath{
    //新建左滑出现的按钮
    UITableViewRowAction *actBtn1 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"删除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
        //点击后做什么
    }];
    actBtn1.backgroundColor = [UIColor orangeColor];
    
    UITableViewRowAction *actBtn2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"关注" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
        //点击后做什么
        self.tableView.editing = NO;   //向右退回按钮(隐藏)
    }];
    return @[actBtn1,actBtn2];   //返回按钮数组
}

常用属性

  • 对于整个tableview来说,包括

样式(单组或多组)
UITableViewStylePlainUITableViewStyleGrouped
contentView,每一行就是一个contentview
行高(所有行)rowHeight
滚动条颜色indicatorStyle= UIScrollViewIndicatorStyleWhite;
分割线
-颜色separatorColor
设为clearColor相当于取消系统分割线
-样式separatorStyle

UITableViewCellSeparatorStyleNone,
UITableViewCellSeparatorStyleSingleLine,(默认)
UITableViewCellSeparatorStyleSingleLineEtched

头部的view
背景色backgroundColor
进入编辑状态
self.tableView.editing = YES;
[self.tableView setEditing:YES animated:YES]; (带动画)
编辑状态下可多选
allowsMultipleSelectionDuringEditing = YES
当前已选中的行的索引:indexPathForSelectedRows

  • 对于组来说,包括

组头标题
组头高sectionHeaderHeight
组尾标题
组尾高sectionFooterHeight

  • 对于行(即一个contentview)来说
    包含以下3个是固有子控件
    imageView、textLabel、detailTextLabel
    右侧视图accessoryView
    行高(某一行)
    背景色backgroundColor
    选中时的样式selectionStyle
    非编辑状态下是否可以选中allowsSelection(默认YES)
    是否可以选中多行allowsMultipleSelection(默认NO)
    可选风格:selectionStyle = UITableViewCellSelectionStyleDefault
    拿到某行cell
PDtableViewCell *cell = [self.myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];

右端提示

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

UITableviewCellStyle(创建时设置,initWithStyle:)

UITableViewCellStyleDefault,
UITableViewCellStyleValue1,
UITableViewCellStyleValue2,
UITableViewCellStyleSubtitle

数据

分为多组数据、单组数据。每一组包含若干行数据。
一般的做法是将数据独立出来成为一个模型(数据类),然后从模型中引入数据。

数据源方法补充

1. numberOfSectionsInTableView:------------设置表格的组数
2. tableView:numberOfRowInSection:--------设置每个组有多少行
3. tableView:cellForRowAtIndexPath:-------设置单元格显示的内容
4. tableView:titleForHeaderInSection:------设置组表的头标签视图
5. tableView:titleForFooterInSection:-------设置组表的尾标签视图
6. tableView:canEditRowAtIndexPath:----设置单元格是否可以编辑
7. tableView:canMoveRowAtIndexPath:--设置单元格是否可以移动
8. tableView:sectionIndexTitleForTableView:atIndex:-------设置指定组的表的头标签文本
9. tableView:commitEditingStyle:forRowAtIndexPath:----------编辑单元格(添加,删除)
10. tableView:moveRowAtIndexPath:toIndexPath-------单元格移动

代理方法补充

1. tableView: willDisplayCell: forRowAtIndexPath:----------设置当前的单元格
2. tableView: heightForRowAtIndexPath:---------设置每行的高度
3. tableView:tableView heightForHeaderInSection:-----------设置组表的头标签高度
4. tableView:tableView heightForFooterInSection:-----------设置组表的尾标签高度
5. tableView: viewForHeaderInSection:----------自定义组表的头标签视图
6. tableView: viewForFooterInSection: ----------自定义组表的尾标签视图
7. tableView: accessoryButtonTappedForRowWithIndexPath:-----------设置某个单元格上的右指向按钮的响应方法
8. tableView: willSelectRowAtIndexPath:---------获取将要选择的单元格的路径
9. tableView: didSelectRowAtIndexPath:---------获取选中的单元格的响应事件
10.tableView: tableView willDeselectRowAtIndexPath:------------获取将要未选中的单元格的路径
11. tableView: didDeselectRowAtIndexPath:-----------获取未选中的单元格响应事件
12.tableView: willDisplayCell:--------------//当cell将要显示时调用

数据的刷新

只要修改、添加、删除模型,然后刷新数据即可。处理的对象是模型,只要模型中的数据变了,tableview的样子就会改变。所以,修改模型才是本质,不要采用直接拿到某行cell进行删除、添加cell、改变cell的内容的做法。

全局

[self.myTableView reloadData];     (全局刷新,整个tableview的数据都重新刷新)
  • 数据刷新,然后tableview就会重新调用数据源方法

局部

    NSArray *indexPs = @[[NSIndexPath indexPathForRow:0 inSection:0]];
    [self.myTableView reloadRowsAtIndexPaths:indexPs withRowAnimation:UITableViewRowAnimationMiddle];
只刷新某些行, indexPs指所要刷新的行 数组,指定某组某行。

注意:reloadRowsAtIndexPaths方法使用前提是,保证模型数组个数不变。因此,这个方法不适用于添加数据的情况。对于添加操作,用insertRowsAtIndexPaths方法,添加指定的行。

    NSArray *indexPs = @[[NSIndexPath indexPathForRow:0 inSection:0]];
    [self.myTableView insertRowsAtIndexPaths:indexPs withRowAnimation:UITableViewRowAnimationLeft];

删除操作后的刷新(带动画)

//参数中指明所要删除的行(数组)
[self.myTableView deleteRowsAtIndexPaths:。。。withRowAnimation:UITableViewRowAnimationAutomatic];

关于UITableviewCell

每一个cell包含3个子控件(属性),即,ImageView,textlabel,detiltextlabel
创建:

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

推荐阅读更多精彩内容