UITableView

转自:UITableView

ios中UITableView,也就是表视图,这在ios系统中是非常常见的,开发这种表视图也是非常方便的,在工具栏中,直接将UITableView拖拉到xib中即可,如下:

uitable1 UITableView

UITableView

在UIViewController之后添加<UITableViewDelegate, UITableViewDataSource>,UITableViewDelegate和 UITableViewDataSource在Objective-C中称之为协议,要实现协议中必要的方法(因为有可选的方法)。为什么要使用这两个协议呢?因为我们要将数据填充到UITableView中,这样子,那UITableViewDelegate和 UITableViewDataSource应该与数据填充有关了,其实看它的命名也可以看得出了。

UITableViewDataSource是用来连接数据和表视图的,要实现两个方法,一个是tableView:cellForRowAtIndexPath,另一个是tableView:numberOfRowsInSection,实现这两个方法,你就告诉了表视图显示多少行数据和每一行中的数据。

UITableViewDelegate是负责处理UITableView的表现,该协议中的可选方法让你管理表行的高度,配置节点头部和底部,对表单元重新排序等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#import "SimpleTableViewController.h"
 
@implementation SimpleTableViewController
 
NSArray *tableData;
 
- (void)didReceiveMemoryWarning
{
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
 
// Release any cached data, images, etc that aren't in use.
}
 
#pragma mark - View lifecycle
 
/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
[super viewDidLoad];
}
*/
 
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
 
@end

viewDidLoad是在控制器的视图装载到内存中完成之后,调用该方法,添加以下代码实例化tableData数组:

1
2
3
4
5
6
7
8
9
10
- (void)viewDidLoad
{
    [super viewDidLoad];
    tableData=[NSArray arrayWithObjects:@"Egg Benedict",
               @"Mushroom Risotto",@"Full Breakfast",
               @"Hamburger",@"Ham and Egg Sandwich",
               @"Creme Brelee",@"White Chocolate",
               @"Starbucks Coffee",@"Vegetable Curry",
               @"Instant Noodle with Egg",nil];
}

实现UITableViewDataSource协议中的两个方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//count
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [tableData count];
}
 
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier=@"SimpleTableItem";
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if(cell==nil){
        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }
    cell.textLabel.text=[tableData objectAtIndex:indexPath.row];
    return cell;
}

count方法返回tableData数组中元素个数,每行数据显示的时候,会调用cellForeRowAtIndexPath 方法。dequeueReusableCellWithIdentifier: 方法返回的是一个可重用的表规图单元格对象。因为如果表非常大,为每一行都创建一个单独的 UITableViewCell对象会产生严重的性能问题,会占用大量的内存。 此外,由于表视图在某一个时刻会显示固定数量的行,因此重用已经滚动到屏幕外面的那些单元格将非常有意义。 这正是dequeueReusableCellWithIdentifier: 方法将要完成的事情。比如,如果表视图显示了 10 行,那么会创建 10 个 UITableViewCell 对象 — 当用户滚动表视图时,总是会重用返 10 个 UITableViewCell 对象。

SimpleTableViewController.xib 文件,点击并按住 Control 键,选择表视图,并拖拉到 Files Owner图上,释放按钮,弹出 dataSource 和 delegate 窗口。选择 dataSource,在表视图和它的数据源之间建立连接。重复上述操作,在委托(delegate)上也建立连接。

运行如下:

iphone UITableView
posted @ 2013-04-16 11:10  寒星晓月 专注移动互联网  阅读(1634)  评论(0编辑  收藏  举报