实现的功能:演示表TableView的使用方法
关键词:TableView
1、创建一个Single View Application工程,命名为:TableViewDemo,如下图
[img]
[/img]
2、修改ViewController.xib,添加一个Table View控件,连接操作,如下
[img]
[/img]
3、视图控制器ViewController,需要实现协议UITableViewDataSource、UITableViewDelegate中的必须实现的方法,
在工程目录依次展开Frameworks->UIKit.framework->Headers,然后打开UITableView.h,搜索找到协议UITableViewDataSource、UITableViewDelegate的定义,如下
[img]
[/img]
4、修改ViewController.h,如下
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property(nonatomic,retain)NSMutableArray *apps;
@end
5、修改ViewController.m,如下
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize apps;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//加载数据
[self loadData];
}
//模拟加载数据
-(void)loadData{
apps = [[NSMutableArray alloc]init];
for(int i=0;i<8;i++){
[apps insertObject:[NSString stringWithFormat:@"App-%d",(i+1)] atIndex:i];
}
}
- (void)viewDidUnload
{
[super viewDidUnload];
apps = nil;
// Release any retained subviews of the main view.
}
-(void)dealloc{
[super dealloc];
[apps release];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
#pragma mark table view datasource methods
//可选实现的方法,默认为1
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;{
return 1;
}
//必须实现的方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [apps count];
}
//必须实现的方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//
NSString *myTableViewCellIdentifier = @"myTableViewCellIdentifier";
UITableViewCell *cell = [[UITableView alloc]dequeueReusableCellWithIdentifier:myTableViewCellIdentifier];//备注1
if(cell==nil){
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:myTableViewCellIdentifier]; //备注2
}
NSString *imageName = [NSString stringWithFormat:@"%d",[indexPath row]+1];
//cell.image = [UIImage imageNamed:imageName]; //这种用法已经废弃
cell.imageView.image = [UIImage imageNamed:imageName];
cell.textLabel.text = [apps objectAtIndex:[indexPath row]];
cell.textLabel.textAlignment = UITextAlignmentLeft;
cell.textLabel.font = [cell.textLabel.font fontWithSize:30];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
}
//可选实现的方法
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
return @"Header";
}
//可选实现的方法
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
return @"Footer";
}
#pragma mark table view data delegate methods
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 50;
}
@end
备注1、备注2,代码解释:1)表中的每一行都拥有一个子视图,即一个UITableViewCell类的实例
2)对于一个拥有大量数据的表,如果UITableView为表中的每一行都分配一个UITableViewCell的实例,而不管该行是否正在显示,这无疑将带来大量内容开销。当然,UITableView并不是这样设计的。
3)只有当前显示的行才被分配UITableViewCell的实例,因滚动操作已离开屏幕的表视图单元(UITableViewCell的实例)将被放置在一个可以被重用的单元序列中。
如果系统运行比较缓慢,表视图就从该序列中删除这些单元,以释放存储空间;
只要有可用的存储空间,表视图就会重新获取这些单元,以便以后再次使用。
4)//当一个表单视图滚出屏幕时,另一个表单视图就会从另一边滚动到屏幕上,如果滚动到屏幕上的新行重新使用从屏幕上滚动下来的那些单元格中的某一个单元格,系统就会避免与不断创建和释放那些视图相关的开销。
5)为了使用此机制,需要一个标识符(identifier)来标示可重用的单元格
6)表第一次初始化时肯定没有可重用的表单元,所以需要初始分配:
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:myTableViewCellIdentifier];
reuseIdentifier参数即标示该表单元可重用的标示符
6、编译、运行,效果如下
[img]
[/img]
在使用UITableView的时候,UITableViewCell的高度可能要改变。改变行高有两种情况,第一种是改变所有的行高。第二种是改变特定行的行高。
第一种,改变所有行的行高。就是类似下面的效果。
[img]
[/img]
这里要使用UITableViewDelegate的方法:
//设置rowHeight
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 91.5;
}
第二种,如果要指定改变某个行的行高。就类似下面的效果。
[img]
[/img]
只要对上面的方法做一下修改如下:
//设置rowHeight
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0 && indexPath.row == 0) {
return 220;
}
else
{
return 40;
}
}