IOS中表视图(UITableView)使用详解

IOS中UITableView使用总结

一、初始化方法

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

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

?


1

2

3

4

typedef NS_ENUM(NSInteger, UITableViewStyle) {

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

    UITableViewStyleGrouped                 // 分组的表视图风格

};

二、常用属性

获取表视图的风格(只读属性)

@property (nonatomic, readonly) UITableViewStyle           style;

设置表示图代理和数据源代理(代理方法后面讨论)

@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之后可用)

@property (nonatomic)          CGFloat                     estimatedRowHeight; 

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

下面这两个属性和上面相似,分别设置分区头视图和尾视图的估计高度(7.0之后可用)

@property (nonatomic)          CGFloat            estimatedSectionHeaderHeight;  @property (nonatomic)          CGFloat            estimatedSectionFooterHeight;

设置分割线的位置

@property (nonatomic)          UIEdgeInsets                separatorInset;

如果细心,你可能会发现系统默认的tableView的分割线左端并没有顶到边沿。通过这个属性,可以手动设置分割线的位置偏移,比如你向让tableView的分割线只显示右半边,可以如下设置:

?


1

2

UITableView * tab = [[UITableView alloc]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参数决定定位的相对位置,它使一个枚举,如下:

?


1

2

3

4

5

6

typedef NS_ENUM(NSInteger, UITableViewScrollPosition) {

    UITableViewScrollPositionNone,//同UITableViewScrollPositionTop

    UITableViewScrollPositionTop,//定位完成后,将定位的行显示在tableView的顶部    

    UITableViewScrollPositionMiddle,//定位完成后,将定位的行显示在tableView的中间   

    UITableViewScrollPositionBottom//定位完成后,将定位的行显示在tableView最下面

};

使表示图定位到选中行

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

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

四、tableView操作刷新块的应用

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

插入分区

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

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

?


1

2

3

4

5

6

7

8

9

10

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; 

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

?


1

2

3

4

[tab beginUpdates];

    [tab deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:1 inSection:0]] withRowAnimation:UITableViewRowAnimationLeft];

    [dataArray removeObjectAtIndex:1];

    [tab endUpdates];

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

五、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 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;

这个风格是一个枚举,如下:

?


1

2

3

4

5

typedef NS_ENUM(NSInteger, UITableViewCellSeparatorStyle) {

    UITableViewCellSeparatorStyleNone,//无线

    UITableViewCellSeparatorStyleSingleLine,//有线

    UITableViewCellSeparatorStyleSingleLineEtched  

};

设置分割线颜色

@property (nonatomic, retain) UIColor           *separatorColor;

设置分割线毛玻璃效果(IOS8之后可用)

@property (nonatomic, copy) UIVisualEffect      *separatorEffect;

注意:这个属性是IOS8之后新的。

设置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

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

通过OC类注册cell

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

上面两个方法是IOS6之后的方法。

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

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

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

关于tableView的代理方法,因为篇幅原因,总结在下一篇博客中。

时间: 2024-10-14 07:57:53

IOS中表视图(UITableView)使用详解的相关文章

iOS应用中使用Toolbar工具栏方式切换视图的方法详解_IOS

关于UIToolbarToolBar工具栏是视图View的属性,可以在工具栏上添加工具栏按钮Bar Button Item(可以是自定义的Custom.也可以是系统自带的BarButtonSystemItem ),视图控制器可以通过工具栏项对视图中内容进行操作. 注意事项: 在导航栏控制器中会有一个UIToolBar实例,但默认是隐藏的,如果需要显示,需要通过这个方法将其打开: 在这里需要注意的是,与UINavigationBar类似,导航控制器拥有且只拥有一个UIToolBar实例,但UITo

IOS中Json解析实例方法详解(四种方法)_IOS

作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此"http://www.bejson.com/"网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的iOS版本,可以使用第三方库来解析Json. 本文将介绍Tou

Excel表格中视图功能相关详解

  Excel表格中视图功能相关详解          一.同时查看两个excel文件 打开两个excel文件 视图 - 全部重排 - 垂直/水平并排 二.同时查看同一个excel文件的两个excel工作表 视图 - 新建窗口 - 全部重排 - 垂直/水平并排 三.同时查看同一个表的两个不同区域 1.第一行不动(向下翻看excel表时,让一个表格的第一行固定不动) 视图 - 冻结窗格 - 冻结首行 2.同时查看两个动态区域 选取某一行 - 视图 - 拆分,可以把界面拆分成上下两部分,和冻结不同的

iOS中UIWebView的使用详解

iOS中UIWebView的使用详解 一.初始化与三种加载方式      UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种: 第一种: - (void)loadRequest:(NSURLRequest *)request; 这是加载网页最常用的一种方式,通过一个网页URL来进行加载,这个URL可以是远程的也可以是本地的,例如我加载百度的主页: ? 1 2 3     UIWebView * view = [

IOS实现碎片化动画详解_IOS

碎片化效果图 遮罩视图 在UIView中有一个maskView属性,这个属性是我们今天实现动画的最重要的变量.这个属性在iOS8之后开始使用,用来表示视图的遮罩.什么是遮罩呢?我想了很久都没有找到合适的比喻来介绍这个.简单来说,一个UIView的对象,可以通过设置alpha来改变这个视图的透明度,遮罩的实现效果也是一样的.唯一的差别在于前者是通过修改0~1之间的值来改变透明效果,作为遮罩的视图对象的backgroundColor.alpha.transform等等属性都会影响到被遮盖的视图的透明

iOS百度地图简单使用详解_IOS

百度地图 iOS SDK是一套基于iOS 5.0及以上版本设备的应用程序接口,不仅提供展示地图的基本接口,还提供POI检索.路径规划.地图标注.离线地图.定位.周边雷达等丰富的LBS能力 . 今天主要介绍以下接口 基础地图 POI检索 定位 首先配置环境 1.自动配置.framework形式开发包(使用CocoaPods)<推荐> 2.手动配置.framework形式开发包 特别注意: (API里有很多注意点,大家可以具体去看.但是我说的后两点少其中一个都会失败,第一点是有需求的话,必须加上)

Yii中表单用法实例详解_php实例

本文实例讲述了Yii中表单用法.分享给大家供大家参考,具体如下: 在 Yii 中处理表单时,通常需要以下步骤: 1. 创建用于表现所要收集数据字段的模型类. 2. 创建一个控制器动作,响应表单提交. 3. 在视图脚本中创建与控制器动作相关的表单. 一.创建模型 在编写表单所需的 HTML 代码之前,我们应该先确定来自最终用户输入的数据的类型,以及这些数据应符合什么样的规则.模型类可用于记录这些信息.正如模型章节所定义的,模型是保存用户输入和验证这些输入的中心位置. 取决于使用用户所输入数据的方式

iOS CoreData 增删改查详解_IOS

最近在学习CoreData, 因为项目开发中需要,特意学习和整理了一下,整理出来方便以后使用和同行借鉴.目前开发使用的Swift语言开发的项目.所以整理出来的是Swift版本,OC我就放弃了. 虽然Swift3 已经有了,目前整理的这个版本是Swift2 的.Swift 3 的话有些新特性. 需要另外调整,后续有时间再整理.  继承CoreData有两种方式:  创建项目时集成   这种方式是自动继承在AppDelegate里面,调用的使用需要通过UIApplication的方式来获取AppDe

IOS中的各种Picker详解

简述 在应用的一些设置中经常要用到一些Picker来快速帮助用户选定取值,一般会用到的有 UIDatePicker,UIPickerView以及UIImagePickerController. 初始界面 如图,在搭建好的界面,实现方法来完成各个选择.首先是日期选择 UIDatePicker 主要需要设置的属性有 locale datePickerMode UIDatePicker *datePicker = [[UIDatePicker alloc] init]; datePicker.loca