iOS中UITableView使用总结

第一:UITableView的基本使用

一、初始化方法
- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style;  
 
//这个方法初始化表视图的frame大小并且设置一个风格,UITableViewStyle是一个枚举,如下: 
typedef NS_ENUM(NSInteger, UITableViewStyle) {
    UITableViewStylePlain,                  // 标准的表视图风格
    UITableViewStyleGrouped                 // 分组的表视图风格
};
二、常用属性
  • 设置UITableView代理和数据源代理(注意:这一点至关重要)
@property (nonatomic, assign)   id <UITableViewDataSource> dataSource; 
@property (nonatomic, assign)   id <UITableViewDelegate>   delegate; 
  • 设置UITableViewCell高度(默认为44)(注意:当所有的Cell的高度相同可以有该属性设置Cell高度;当Cell的高度不同是就不可以用该属性设置了。)
@property (nonatomic)CGFloat rowHeight;  
  • 设置分区的头视图高度和尾视图高度(当代理方法没有实现时才有效)
@property (nonatomic)          CGFloat                     sectionHeaderHeight;    
@property (nonatomic)          CGFloat                     sectionFooterHeight;  

注意:这个属性官方的解释是如果你的UITableViewCell高度是可变的,那么设计一个估计高度可以加快代码的运行效率。<NS_AVAILABLE_IOS(7_0) >

@property (nonatomic)          CGFloat                     estimatedRowHeight;
  • 下面这两个属性和上面相似,分别设置分区头视图和尾视图的估计高度
@property (nonatomic)          CGFloat            estimatedSectionHeaderHeight;  @property (nonatomic)          CGFloat            estimatedSectionFooterHeight; 
  • 设置分割线的位置 和分割线颜色
@property (nonatomic)          UIEdgeInsets                separatorInset;
 @property (nonatomic, strong, nullable) UIColor *separatorColor 
三、常用方法详解
  • 重载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中的位置信息 和获取某个cell在tableView中的位置信息
- (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point;   
- (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell;  
  • 根据一个矩形范围返回一个信息数组,数组中是每一行row的位置信息
- (NSArray *)indexPathsForRowsInRect:(CGRect)rect;  
  • 通过位置路径获取cell
- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;  
  • 根据分区获取头视图 和根据分区获取尾视图
- (UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section; 

- (UITableViewHeaderFooterView *)footerViewForSection:(NSInteger)section;  
  • 使表示图定位到某一位置(行)
- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated; 
// 注意:indexPah参数是定位的位置,决定于分区和行号。animated参数决定是否有动画。scrollPosition参数决定定位的相对位置,它使一个枚举,如下: 
typedef NS_ENUM(NSInteger, UITableViewScrollPosition) {
    UITableViewScrollPositionNone,//同UITableViewScrollPositionTop
    UITableViewScrollPositionTop,//定位完成后,将定位的行显示在tableView的顶部    
    UITableViewScrollPositionMiddle,//定位完成后,将定位的行显示在tableView的中间   
    UITableViewScrollPositionBottom//定位完成后,将定位的行显示在tableView最下面
};
  • 使表示图定位到选中行
- (void)scrollToNearestSelectedRowAtScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated; 
这个函数与上面的非常相似,只是它是将表示图定位到选中的行。 
四、tableView操作刷新块的应用

在介绍动画块之前,我们先看几个函数:

  • 给UITableView插入分区
- (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;  

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

    [tab beginUpdates];
    [tab deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:1 inSection:0]] withRowAnimation:UITableViewRowAnimationLeft];
    [dataArray removeObjectAtIndex:1];
    [tab endUpdates];
//注意:不要在这个块中调用reloadData这个方法,它会使动画失效。 
五、UITableView的编辑操作
  • 设置是否是编辑状态(编辑状态下的cell左边会出现一个减号,点击右边会划出删除按钮)
@property (nonatomic, getter=isEditing) BOOL editing;                              
- (void)setEditing:(BOOL)editing animated:(BOOL)animated; 
  • 设置cell编辑模式下选择的状态
//设置cell是否可以被选中(默认为YES) 
@property (nonatomic) BOOL allowsSelection; 

//设置cell编辑模式下是否可以被选中
@property (nonatomic) BOOL allowsSelectionDuringEditing;   

//设置是否支持多选 
@property (nonatomic) BOOL allowsMultipleSelection; 

//设置编辑模式下是否支持多选 
@property (nonatomic) BOOL allowsMultipleSelectionDuringEditing; 
六、选中cell的相关操作
  • 获取选中cell的位置信息
- (NSIndexPath *)indexPathForSelectedRow;  
获取多选cell的位置信息 
- (NSArray *)indexPathsForSelectedRows; 
  • 代码手动选中与取消选中某行
- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition; 
- (void)deselectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated; 
注意:这两个方法将不会回调代理中的方法。
七、tableView附件的相关方法
  • 设置索引栏
//设置索引栏最小显示行数
@property (nonatomic) NSInteger sectionIndexMinimumDisplayRowCount;                  //设置索引栏字体颜色 
@property (nonatomic, retain) UIColor *sectionIndexColor; 
//设置索引栏背景颜色 
@property (nonatomic, retain) UIColor *sectionIndexBackgroundColor; 
//设置索引栏被选中时的颜色 
@property (nonatomic, retain) UIColor *sectionIndexTrackingBackgroundColor; 
  • 设置分割线的风格
@property (nonatomic) UITableViewCellSeparatorStyle separatorStyle; 
这个风格是一个枚举,如下: 
typedef NS_ENUM(NSInteger, UITableViewCellSeparatorStyle) {
    UITableViewCellSeparatorStyleNone,//无线
    UITableViewCellSeparatorStyleSingleLine,//有线
    UITableViewCellSeparatorStyleSingleLineEtched  
};
  • 设置tableView头视图 、设置tableView尾视图
@property (nonatomic, retain) UIView *tableHeaderView;   
@property (nonatomic, retain) UIView *tableFooterView;  

第二:UITbleViewCell滑动多按钮

#pragma mark 编辑按钮
- (void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [super setEditing:editing animated:animated];
    [self.myTableView setEditing:!self.myTableView.isEditing animated:YES];
}
#pragma mark 设置可以进行编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}
#pragma mark 设置编辑的样式
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
  return UITableViewCellEditingStyleDelete;
}
#pragma mark 设置处理编辑情况
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    //根据不同的编辑状态做一些操作
}
#pragma mark 在滑动手势删除某一行的时候,显示出更多的按钮
- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //添加一个删除按钮
    UITableViewRowAction *deleteRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"删除" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
        NSLog(@"点击了删除");

        //移除要删除的数据
        [self.datas removeObjectAtIndex:indexPath.row];
        //更新UITableView
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }];

    // 添加一个置顶按钮
    UITableViewRowAction *topRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"置顶" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
        NSLog(@"点击了置顶");
        //交换数据
        [self.datas exchangeObjectAtIndex:indexPath.row withObjectAtIndex:0];
     
        NSIndexPath *firstIndexPath = [NSIndexPath indexPathForRow:0 inSection:indexPath.section];
        //更新UITableView
        [tableView moveRowAtIndexPath:indexPath toIndexPath:firstIndexPath];
    }];
    topRowAction.backgroundColor = [UIColor blueColor];

    // 添加一个更多按钮
    UITableViewRowAction *moreRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"更多" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
        NSLog(@"点击了更多");

        [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationMiddle];
    }];
    moreRowAction.backgroundEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
    // 将设置好的按钮放到数组中返回
    return @[deleteRowAction, topRowAction, moreRowAction];

}

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

推荐阅读更多精彩内容