您的位置:首页 > 产品设计 > UI/UE

iOS开发学习总结——UITableView使用初步

2017-01-06 12:30 405 查看
一、UITableView概述

UITableView是iOS开发中最常用的控件之一,大多数应用程序中使用UITableView作为列表来展示内容。UITableViewController中包含了一个UITableView,它和UIViewController的区别还不是很清楚,目前只知道UITableViewController是从UIViewController继承而来。还请大神指点。

UITableView的属性常用的有两个,一个是它的Content,Dynamic Prototypes是可以滚动的可重用的列表,而Static Cells是静态的列表。还有一个属性是Style,可以选择Plain(类似于通讯录的样式,用于显示搜索结果等)和Grouped(类似与系统设置的样式,用于显示菜单等)。还有关于分割线的一些属性。

二、UITableViewCell和NSIndexPath

UITableViewCell对应的是单元格,在Dynamic Prototypes模式下,UITableViewCell是要求可以重用的,所以在这种情况下不能用@IBOutlet将变量和视图中的Cell进行关联。在Static Cells模式下应该可以,不过用的比较多的还是Dynamic Prototypes模式。

UITableViewCell包含了一个Title和一个Details,分别对应单元格的主标题和说明,二者都是UITextLabel*类型,还包括了一个位于左侧的imageView和位于右侧的accessoryView,类型分别为UIImageView和UIView,左侧可放入图像,右侧可以放入任意的控件(开关,选择框等)。

在UITableViewCell的构造方法中,需要指明Style和reuseIdentifier(重用标识符)。

NSIndexPath是一个类似于二维数组的类型,其中成员section是确定了单元格所在的分组,而成员row是确定了单元格在所在分组中的位置,主要用于cellForRowAtIndexPath:和didSelectRowAtIndexPath:这两个方法。

三、UITableView的数据源协议(UITableViewDataSource)

UITableViewDataSource是UITableView的一个协议,其中包含了关于UITableView的布局、数据源等方面的一些方法,常用的有如下几个:

指定列表中分组的个数

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
指定每个分组的标题(section参数代表分组号)

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
指定每个分组的说明(section参数代表分组号)

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
指定每个分组中单元格的个数(section参数代表分组号)

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
加载每个单元格的时候都会调用的方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
点击每个单元格的时候都会调用的方法

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(nonnull NSIndexPath *)indexPath
其中cellForRowAtIndexPath:方法使用的及其频繁,为了提高运行效率,需要对UITableViewCell进行重用,在用户把某个单元格滑动出界面的时候,iOS会自动将该单元格放入缓存中。所以我们想要重用的话只需要尝试从缓存中取出单元格即可,一般情况下只需要编写如下代码:

NSString *identifier=@"UITableViewCellIdentifier"; //重用标志
UITableViewCell *cell=[_settingsTableView dequeueReusableCellWithIdentifier:(identifier)];
//先尝试从缓存池中取出已经加载的单元格
if(cell==nil) {
cell=[[UITableViewCell alloc]initWithStyle:(UITableViewCellStyleSubtitle) reuseIdentifier:(identifier)];
//如果缓存池中不存在该单元格,则加载该单元格
}
其中第一个NSString*是一个重用标识符,dequeueReusableCellWithIdentifier:方法会首先尝试从缓存池中取出已加载的单元格,如果没有取出,则返回nil。再用if语句判断是否成功取出,如果未取出则需要创建这个单元格(否则会出现空指针异常),创建一个单元格用到的方法是initWithStyle:reuseIdentifier:,其中reuseIdentifier就是之前定义的重用标识符。同时还经常使用下面的方法setSelectionStyle:(UITableViewCellSelectionStyle),其中可以传入参数UITableViewCellSelectionStyleNone,作用是禁止点击该单元格,默认情况下单元格是可以被点击的。还有可以设置是否允许重新排列和是否允许删除单元格的方法,默认值都是不允许。

在调用didSelectRowAtIndex
4000
Path:方法时,只需要根据不同的单元格进行不同的操作即可,其中经常使用的方法是:deselectRowAtIndexPath:(indexPath) animated:(YES),此方法可以使点击产生的高亮条立即消失,不然的话单元格会一直亮着,好像卡住了一样,影响用户体验。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息