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

IOS开发之表视图(UITableView)

2015-08-18 10:40 316 查看
IOS开发之表视图(UITableView)的基本介绍(一)

(一):UITableView的基本概念

1.在IOS开发中,表视图的应用十分广泛和普及。因此掌握表视图的用法显得非常重要。一般情况下对于数据的展示

我们都会选择表视图,比如通讯录和一些数据列表。

2.我们可以选择创建表视图也可以创建表视图控制器。

(二)UITableView基本样式如下(1:UITableViewStylePlain(普通表视图),2:UITableViewStyleGroup(分组表视图)):





(三)UITableView表视图的结构:首先我们来看一张设计图:



根据上面的图,下面我们来分析一下表视图的结构:

1:表头视图(table header view).表视图最上边的视图,用于展示表视图的信息,例如上面下拉刷新信息。

2:表脚视图(table footer view).表视图最下边的视图,用于展示表视图的部分信息,例如上图加载更多信息。

3:单元格(cell)。它是组成表视图每一行的单位视图,上图一行一行的单元图

4:节(selection)。它是多个单元格在组成,并且有节头和节脚,正如上图蓝色框框的(Group Start)节头,(Group End)节尾

5:节头。节的头部,描述节的信息,例如上图 Group Start.

6:节脚.节的尾部,描述节的信息或者一些声明信息。例如上图 Group End.

(四)UITableView表视图的分类

IOS中表视图主要分为两大类(普通表视图与分组表视图),下面来稍微了解一下这两类表视图

1:普通表视图:主要用于一般表,最常见的是,我们不知道有多少数据需要进行显示.

2:分组表视图:主要用于都一些数据进行布局分成不同的组进行显示。见下面的图,左边为普通表视图,右边为分组表视图;





除此之外,看上面左边的图是带上索引列的(efghijk...),同样还可以加上选择列和搜索栏。

3:下图,给用户提供一个选择的列表,这样使用选择表视图可以代替复选框控件。



下面带了搜索栏如:这样可以在我单元格很多的情况之下,去借助搜索栏进行过滤搜索。搜索栏一般都会放在表头。

需要我们把UITableView上滑倒最顶端才能看到搜索栏。



以上就是先介绍一下表视图(UITableView)包括表视图的基本概念,基本样式,结构以及表视图的分类,下一篇就开始实现表视图并进行深入理解。

IOS开发之表视图(UITableView)的相关类,属性与表视图实现学习(二)

(一)UITableView的相关类解析:

首先我们来看张类的结构图:



1:表视图(UITableView)是继承自UIScrollView,这样就可以使得我们的表视图可以实现上下的滚动。

2:同时表视图(UITableView),还有两个委托①:UITableViewDelegate委托协议,一般我们用来处理表视图的基本样式(例如:单元格的高度等)还有去捕捉选中单元格的事件。②:UITableViewDataSource委托协议,必要要去实现该协议的数据源方法,来完成表视图的数据配置。

3:UITableViewController:是表视图(UITableView)的控制器类。

4:UItableViewCell:是单元格类.

(二):数据源协议和委托源协议介绍:

1:UITableViewDataSource协议:我们去实现其中的方法,来完成我们的表视图的数据配置,从而来显示表视图。其中我们必须要去实现的两个方法如下:

[objc] view plaincopy





<span style="font-size:18px;">//进行返回每个section(节)中单元格的数量

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

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:

// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)

// 为表视图中的单元格创建数据

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;</span>

除了以上的两个必须实现的方法,还有一些以下的可选实现方法:

[objc] view plaincopy





<span style="font-size:18px;">// 返回section(节)的个数

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; // Default is 1 if not implemented

//返回section(节)头的标题

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section; // fixed font style. use custom view (UILabel) if you want something different

// 返回section(节)尾的标题

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView; // return list of section titles to display in section index view (e.g. "ABCD...Z#")

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index;

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath;

</span>

2:UITableViewDelegate:协议可以用来设定表视图中的节头与节尾 同时还可以去响应一些点击事件,主要的一些方法如下:

[objc] view plaincopy





<span style="font-size:18px;">- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section; // custom view for header. will be adjusted to default or specified header height

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section; // custom view for footer. will be adjusted to default or specified footer height

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath;

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;</span>

更多方法可以去官网UITableView进行查询。

(三) 表视图(UITableView)的一些常用方法和属性:

1:常用属性:

①:@property(nonatomic) UITableViewCellSeparatorStyle separatorStyle; 默认为UITableViewCellSeparatorStyleSingleLine

②:@property(nonatomic,retain) UIColor *separatorColor; 默认为:the standard separator gray

③:@property(nonatomic,retain) UIView *tableHeaderView; 头部视图

④:@property(nonatomic,retain) UIView *tableFooterView; 尾部视图

⑤:@property(nonatomic) CGFloat rowHeight; // 单元格高度

⑥:@property(nonatomic) CGFloat sectionHeaderHeight; // 头部行高

⑦:@property(nonatomic) CGFloat sectionFooterHeight; //尾部行高

⑧:@property(nonatomic,readwrite,retain) UIView *backgroundViewNS_AVAILABLE_IOS(3_2);

⑨:@property(nonatomic,readonly) UITableViewStyle style;

2:常用方法:

①:- (void)reloadData; // reloads everything from scratch. redisplays visible rows. because we only keep info about visible rows, this is cheap. will adjust offset if table shrinks 刷新单元格的数据

②:- (void)reloadSectionIndexTitlesNS_AVAILABLE_IOS(3_0); // reloads the index bar.

③:- (NSInteger)numberOfSections; //返回节的数量

④:- (NSInteger)numberOfRowsInSection:(NSInteger)section;//返回每个节的单元格的数量

⑤:- (CGRect)rectForSection:(NSInteger)section; // includes header, footer and all rows

⑥:- (CGRect)rectForHeaderInSection:(NSInteger)section;

⑦:- (CGRect)rectForFooterInSection:(NSInteger)section;

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

⑨:- (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point; // returns nil if point is outside table

⑩:- (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell; //返回指定单元格的NSIndexPath实例

十一:- (NSArray *)indexPathsForRowsInRect:(CGRect)rect; //返回指定范围的NSIndexPath实例数组

十二:- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath; // returns nil if cell is not visible or index path is out of range //返回指定NSIndexPath实例的单元格实例

十三:- (NSArray *)visibleCells; //返回可见的单元格的数组

十四- (NSArray *)indexPathsForVisibleRows; //返回可见单元格的NSIndexPath实例数组

十五:- (UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)sectionNS_AVAILABLE_IOS(6_0);

十六:- (UITableViewHeaderFooterView *)footerViewForSection:(NSInteger)sectionNS_AVAILABLE_IOS(6_0);

十七:- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated; //滑动到指定的位置,并且可以加上动画效果

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

(四)例子实现表格布局

简单的来说:是以下几个步骤:1.配置数据源,2.实现数据源方法,3.设置代理方法。下面来看实例

[objc] view plaincopy





<span style="font-size:18px;">//

// ZTTRootViewController.m

// UITableViewDemo1

//

// Created by 江清清 on 14-3-19.

// Copyright (c) 2014年 江清清<<a>http://www.0513.it/</a>中天科技软件技术股份有限公司>. All rights reserved.

//

#import "ZTTRootViewController.h"

#import "ZTTDetailsViewController.h"

#define kDeviceHeight [UIScreen mainScreen].bounds.size.height

@interface ZTTRootViewController ()

@end

@implementation ZTTRootViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

{

self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

if (self) {

self.title=@"UITableView Style";

}

return self;

}

-(void)loadView{

UIView *view=[[UIView alloc]initWithFrame:[UIScreen mainScreen].applicationFrame];

//[view setBackgroundColor:[UIColor redColor]];

self.view=view;

[view release];

//开始进行配置数据源

self.listArray=@[@"UITableViewStylePlain",@"UITableViewStyleGrouped"];

_tableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320,kDeviceHeight-20-44) style:UITableViewStylePlain];

//实现数据源方法

[_tableView setDataSource:self];

//设置点击事件 代理方法

[_tableView setDelegate:self];

[self.view addSubview:_tableView];

}

- (void)viewDidLoad

{

[super viewDidLoad];

// Do any additional setup after loading the view.

}

- (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

#pragma mark- tableview date source

/*

* 一个selection中又多少个单元格

*/

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

{

return [_listArray count];

}

// indexPath

//创建单元格

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

static NSString *cellInditifier=nil;

// 创建单元格对象

UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellInditifier];

if(cell ==nil){

cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellInditifier]autorelease];

}

NSString *text=[self.listArray objectAtIndex:indexPath.row];

cell.textLabel.text=text;

return cell;

}

// 表视图中有几个selection

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

return 1;

}

// 选中单元格的方法

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

NSLog(@"didSelect");

//进行跳转到相应的页面

ZTTDetailsViewController *detailsVC=[[ZTTDetailsViewController alloc]init];

detailsVC.isPlain=indexPath.row==0?YES:NO;

[self.navigationController pushViewController:detailsVC animated:YES];

[detailsVC release];

}

-(void)dealloc{

[_tableView release];

_tableView=nil;

[super dealloc];

}

@end

</span>

运行截图如下:



3:上面的代码例子是一般的表格,如果我们要表格中加入表头(header)和表尾(footer)话,我们需要实现以下两个数据源方法:

[objc] view plaincopy





<span style="font-size:18px;">- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section; // fixed font style. use custom view (UILabel) if you want something different

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;</span>

运行截图如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: