iOS开发:UITableView的API详解大全

一、初始化方法



1:TableView风格设置。

- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style;

这个方法初始化表视图的frame大小并且设置一个风格,UITableViewStyle是一个枚举,如下:

typedefNS_ENUM(NSInteger,UITableViewStyle) {

UITableViewStylePlain,// 标准的表视图风格

UITableViewStyleGrouped// 分组的表视图风格

};

2:完成tableView的创建  (cell重用)

传统方法 or  注册法(推荐)

1:传统方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];

if (!cell) {

cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"UITableViewCell"];

}

return cell;

}

2:注册法:(推荐)

1⃣️先在TableView的属性设置(懒加载)注册(这里注册的是Xib的cell,不用Xib的同理)

[tableView registerNib:[UINib nibWithNibName:@"***" bundle:nil] forCellReuseIdentifier:@"Identifier"];

2⃣️:在方法中通过直接获取注册的cell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

*** * cell = [tableView dequeueReusableCellWithIdentifier:@"Identifier" forIndexPath:indexPath];

return cell;

}



二、常用属性

TableView视图风格(枚举,只读属性)

@property(nonatomic,readonly)UITableViewStyle  style;


设置表示图代理和数据源代理(如果没有设置委托代理,则代理方法中关于TableView的设置无效,新手常犯错误)

@property(nonatomic,assign)id <UITableViewDataSource>dataSource;

@property(nonatomic,assign)id <UITableViewDelegate>delegate;

设置表示图的行高(默认为44) 

注意,当使用代理方法设置高度时候,属性设置高度会无效

@property(nonatomic)CGFloat rowHeight;


区头和区尾的高度

(关于高度设置建议不要用属性设置,可在对应的方法中设置:这里方法就不粘贴了)

@property(nonatomic)CGFloat   sectionHeaderHeight;

@property(nonatomic)CGFloat   sectionFooterHeight;

设置一个行高的估计值(默认为0,表示没有估计,7.0之后可用),

这个属性官方的解释是:如果你的tableView的行高是可变的,那么设计一个估计高度可以加快代码的运行

@property(nonatomic)CGFloat  estimatedRowHeight;

// or

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {

// return xx    }

解释:面对种类不同的 cell,我们依然可以使用简单的 estimatedRowHeight 属性赋值,只要整体估算值接近就可以,比如大概有一半 cell 高度是 44, 一半 cell 高度是 88, 那就可以估算一个 66,基本符合预期。

参考文档:优化UITableViewCell高度计算的那些事

这里做cell高度的动态自适应推荐第三方库UITableView+FDTemplateLayoutCell

设置分区头视图和尾视图的估计高度和上面类似,不再赘述(7.0之后可用)

@property(nonatomic)CGFloat  estimatedSectionHeaderHeight;

@property(nonatomic)CGFloat  estimatedSectionFooterHeight;,

设置分割线的位置

@property(nonatomic)UIEdgeInsetsseparatorInset;

如果细心,你可能会发现系统默认的tableView的分割线左端并没有顶到边沿。通过这个属性,可以手动设置分

割线的位置偏移,比如你向让tableView的分割线只显示右半边,可以如下设置:

UITableView* tab = [[UITableViewalloc]initWithFrame:self.view.frame style:UITableViewStylePlain];

tab.separatorInset=UIEdgeInsetsMake(0, tab.frame.size.width/2,0,0);

设置tableView背景view视图

@property(nonatomic,readwrite,retain)UIView*backgroundView;


三、常用方法详解

重载tableView

- (void)reloadData;

重载索引栏

- (void)reloadSectionIndexTitles;

这个方法常用语新加或者删除了索引类别而无需刷新整个表视图的情况下。

获取分区数

- (NSInteger)numberOfSections;

根据分区获取行数

- (NSInteger)numberOfRowsInSection:(NSInteger)section;

获取分区的大小(包括头视图,所有行和尾视图)

- (CGRect)rectForSection:(NSInteger)section;

根据分区分别获取头视图,尾视图和行的高度

- (CGRect)rectForHeaderInSection:(NSInteger)section;

- (CGRect)rectForFooterInSection:(NSInteger)section;

- (CGRect)rectForRowAtIndexPath:(NSIndexPath*)indexPath;

获取某个点在tableView中的位置信息

- (NSIndexPath*)indexPathForRowAtPoint:(CGPoint)point;

获取某个cell在tableView中的位置信息

- (NSIndexPath*)indexPathForCell:(UITableViewCell*)cell;

根据一个矩形范围返回一个信息数组,数组中是每一行row的位置信息

- (NSArray*)indexPathsForRowsInRect:(CGRect)rect;

通过位置路径获取cell

- (UITableViewCell*)cellForRowAtIndexPath:(NSIndexPath*)indexPath;

获取所有可见的cell

- (NSArray*)visibleCells;

获取所有可见行的位置信息

- (NSArray*)indexPathsForVisibleRows;

根据分区获取头视图

- (UITableViewHeaderFooterView*)headerViewForSection:(NSInteger)section;

根据分区获取尾视图

- (UITableViewHeaderFooterView*)footerViewForSection:(NSInteger)section;

使表示图定位到某一位置(行)

- (void)scrollToRowAtIndexPath:(NSIndexPath*)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;

注意:indexPah参数是定位的位置,决定于分区和行号。animated参数决定是否有动画。scrollPosition参数

决定定位的相对位置,它使一个枚举,如下:

typedefNS_ENUM(NSInteger,UITableViewScrollPosition) {UITableViewScrollPositionNone,//同UITableViewScrollPositionTopUITableViewScrollPositionTop,//定位完成后,将定位的 显 在tableView的顶部UITableViewScrollPositionMiddle,//定位完成后,将定位的 显 在tableView的中间UITableViewScrollPositionBottom//定位完成后,将定位的 显 在tableView最下

};

使表示图定位到选中行

- (void)scrollToNearestSelectedRowAtScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated;

这个函数与上面的非常相似,只是它是将表示图定位到选中的行。


四、tableView操作刷新块的应用


注意:刷新数据显示有延迟线程原因

[self performInMainThreadBlock:^{

[self.tableView reloadData];

}];

刷新UITableView:整个表

[self.tableView reloadData]

reloadData是刷新整个UITableView,有时候,我们可能需要局部刷新。比如:只刷新一个cell、只刷新一个section等等。这个时候在调用reloadData方法,虽然用户看不出来,但是有些浪费资源。

刷新局部cell

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationFade];

这样就可以很方便的刷新第一个section的第一个cell。虽然看起来代码多了,但是确实比较节省资源。尽量少的刷新,也是UITableView的一种优化。下面是TableView涉及到有关刷新的操作,

刷新局部section

NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndex:0];进阶学习[self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationFade];

tableView有过表格刷新的方法

插入分区

- (void)insertSections:(NSIndexSet*)sections withRowAnimation:(UITableViewRowAnimation)animation;

animation参数是一个枚举,枚举的动画类型如下

typedef  NS_ENUM(NSInteger,UITableViewRowAnimation  {

UITableViewRowAnimationFade,//淡 淡出UITableViewRowAnimationRight,//从右滑UITableViewRowAnimationLeft,//从左滑UITableViewRowAnimationTop,//从上滑UITableViewRowAnimationBottom,//从下滑UITableViewRowAnimationNone,//没有动画UITableViewRowAnimationMiddle,//居中UITableViewRowAnimationAutomatic=100//  动选择合适的动画

};

删除分区

- (void)deleteSections:(NSIndexSet*)sections withRowAnimation:(UITableViewRowAnimation)animation;

重载一个分区

- (void)reloadSections:(NSIndexSet*)sections withRowAnimation:(UITableViewRowAnimation)animation ;


移动一个分区

- (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection;

插入一些行

- (void)insertRowsAtIndexPaths:(NSArray*)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

删除一些行

- (void)deleteRowsAtIndexPaths:(NSArray*)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

重载一些行

- (void)reloadRowsAtIndexPaths:(NSArray*)indexPaths withRowAnimation:(UITableViewRowAnimation)animation;

移动某行

- (void)moveRowAtIndexPath:(NSIndexPath*)indexPath toIndexPath:(NSIndexPath*)newIndexPath;

操作刷新块(个人很少用,这里做个了解)

了解了上面几个函数,我们来看什么是操作刷新块:当我们调用的上面的函数时,tableView会立刻调用代理方法进行刷新,如果其中我们所做的操作是删除某行,而然数据源数组我们可能并没有刷新,程序就会崩溃掉,原因是代理返回的信息和我们删除后不符。

IOS为我们提供了下面两个函数解决这个问题:

开始块标志

- (void)beginUpdates;

结束快标志

- (void)endUpdates;

我们可以将我们要做的操作全部写在这个块中,那么,只有当程序执行到结束快标志后,才会调用代理刷新方法。代码示例如下:

[tabView beginUpdates];

[tabView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:1 inSection:0]]withRowAnimation:UITableViewRowAnimationLeft];[dataArray removeObjectAtIndex:1];

[tableView endUpdates];

注意:不要在这个块中调用reloadData这个方法,它会使动画失效。

参考文档:iOS开发小技巧:刷新UITableView


五、tableView的编辑操作

设置是否是编辑状态(编辑状态下的cell左边会出现一个减号,点击右边会划出删除按钮)

@property(nonatomic,getter=isEditing)BOOL editing;

- (void)setEditing:(BOOL)editing animated:(BOOL)animated;

设置cell是否可以被选中(默认为YES)

@property(nonatomic)BOOL allowsSelection;

设置cell编辑模式下是否可以被选中

@property(nonatomic)BOOL allowsSelection DuringEditing;设置是否支持多选

@property(nonatomic)BOOL allowsMultipleSelection;设置编辑模式下是否支持多选

@property(nonatomic)BOOL allowsMultipleSelection DuringEditing;


六、选中cell的相关操作

获取选中cell的位置信息

- (NSIndexPath*)indexPathForSelectedRow;

获取多选cell的位置信息

- (NSArray*)indexPathsForSelectedRows;

代码手动选中与取消选中某行

- (void)selectRowAtIndexPath:(NSIndexPath*)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition;

- (void)deselectRowAtIndexPath:(NSIndexPath*)indexPath animated:(BOOL)animated;

注意:这两个方法将不会回调代理中的方法。

选中的cell和上一次选中的cell(单选表:选中的cell打对勾,上次选中的挂饰消失)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

NSLog(@"你选中的%ld",(long)indexPath.row);

}

- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {

if ([self.tableView isEditing]) {

//如果tableView是编辑状态-->此方法调用时机:如果你点击的Row已经是被选中的编辑状态,再次点击时调用。

NSLog(@"你取消的编辑状态行号是%ld",(long)indexPath.row);

}else{

//如果tableView不是编辑状态:-->的到你上次点击选中的Row。

NSLog(@"你上次选中的%ld",(long)indexPath.row);

}

}


七、tableView附件的相关方法

设置索引栏最小显示行数

@property(nonatomic)NSIntegersectionIndexMinimumDisplayRowCount;

设置索引栏字体颜色

@property(nonatomic,retain)UIColor*sectionIndexColor;设置索引栏背景颜色

@property(nonatomic,retain)UIColor*sectionIndexBackgroundColor;设置索引栏被选中时的颜色

@property(nonatomic,retain)UIColor*sectionIndexTrackingBackgroundColor;设置分割线的风格

@property(nonatomic)UITableViewCellSeparatorStyleseparatorStyle;这个风格是一个枚举,如下:

typedefNS_ENUM(NSInteger,UITableViewCellSeparatorStyle) {UITableViewCellSeparatorStyleNone,// 线UITableViewCellSeparatorStyleSingleLine,//有线UITableViewCellSeparatorStyleSingleLineEtched

};

设置分割线颜色

@property(nonatomic,retain)UIColor设置分割线毛玻璃效果(IOS8之后可用)

@property(nonatomic,copy)UIVisualEffect注意:这个属性是IOS8之后新的。

*separatorColor;

*separatorEffect;

设置tableView头视图

@property(nonatomic,retain)UIView*tableHeaderView;

设置tableView尾视图

@property(nonatomic,retain)UIView*tableFooterView;

从复用池中取cell

- (id)dequeueReusableCellWithIdentifier:(NSString*)identifier;

获取一个已注册的cell

- (id)dequeueReusableCellWithIdentifier:(NSString*)identifier forIndexPath:(NSIndexPath*)indexPath

从复用池获取头视图或尾视图

- (id)dequeueReusableHeaderFooterViewWithIdentifier:(NSString*)identifier;

通过xib文件注册cell(iOS6之后)

- (void)registerNib:(UINib*)nib forCellReuseIdentifier:(NSString*)identifier;通过OC类注册cell

- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString*)identifier

通过xib文件和OC类获取注册头视图和尾视图

- (void)registerNib:(UINib*)nib forHeaderFooterViewReuseIdentifier:(NSString*)identifier;

- (void)registerClass:(Class)aClass forHeaderFooterViewReuseIdentifier:(NSString*)


更多方法参考: UITableView详解        UITableView 总结

学无止境,做个记录

2017-01-05 -SXH

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

推荐阅读更多精彩内容