UITableView需要一个数据源(dataSource)来显示数据,UITableView会向数据源查询分区的个数、每个分区的行数以及每一行显示的数据等。没有设置数据源的UITableView只是一个空壳。凡是遵守UITableViewDataSource协议的OC对象,都可以是UITableView的数据源。
通常都要为UITableView设置代理对象(delegate),以便在UITableView触发一下事件时做出相应的处理,比如选中了某一行。凡是遵守了UITableViewDalegate协议的OC对象,都可以是UITableView的代理对象。
新建一个基于单文档应用的项目,名为TableView1。
拖一个Table View到ViewController.xib文件中,如图:
建立关联,,将Controller的view设置为Table View,如图:
设置ViewController为Table View的代理和数据源
然后在ViewController.h头文件做数据源和代理协议的声明。
// // ViewController.h // TableView1 // // Created by Rio.King on 13-9-6. // Copyright (c) 2013年 Rio.King. All rights reserved. // #import <UIKit/UIKit.h> @interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> @end
接着在ViewController.m文件中做如下实现:
// // ViewController.m // TableView1 // // Created by Rio.King on 13-9-6. // Copyright (c) 2013年 Rio.King. All rights reserved. // #import "ViewController.h" @interface ViewController () @property(nonatomic,retain)NSMutableArray *data; @end @implementation ViewController - (void)viewDidLoad{ [super viewDidLoad]; //初始化假数据 self.data = [NSMutableArray array]; for (int i = 0; i < 20; i++) { NSString *text = [NSString stringWithFormat:@"Itcase-%i",i]; [self.data addObject:text]; } } - (void) dealloc{ [super dealloc]; [_data release]; } - (void)viewDidUnload{ [super viewDidUnload]; self.data = nil; } #pragma mark - Data Source //pragma mark 分区的个数 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return 1; } //pragram mark 第section分区的行数 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return self.data.count; } //初始化每一行要显示的内容 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease]; cell.textLabel.text = [self.data objectAtIndex:indexPath.row]; return cell; } #pragma mark - Delegate @end
运行结果如下:
如图,默认样式是Plain,你也可以选择Grouped,,也只有这两种样式可以选。
基本的框架就算完成了,,现在就再原有的基础上再修改一下,添加图片和其他的辅助样式。
导入一张png图片,在ViewController.m文件加一句代码即可,其它不用改动
cell.imageView.image = [UIImage imageNamed:@"home.png"];
效果如下:
默认情况下,图片的高度是多少,cell的高度就是多少,,,当然也可以通过代码改变某一cell的高度
#pragma mark - Delegate //pragma mark indexPath对应那行的高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ if (indexPath.row == 0) { return 80;//第一行的高度设置为100 } return 60;//其它的cell高度设置为60 }
效果如下:
------------------------------------------------------------------------------------------------------------------------------
UITableViewCell
- UITableView的每一行都是一个UITableCell,通过dataSource的TableView:CellForRowAtIndexPath:方法来初始化每一行
- UITableViCell是UIView的子类,内部有个默认的子视图:contentView。contentView是UITableViewCell所显示内容的父视图,并负责显示一些辅助指示视图(accessory indicator)。辅助指示视图的作用是显示一个表示动作的图标,可以设置UITableViewCell的accessorType来显示,默认是UITalbeViewCellAccessoryNone(不显示辅助指示视图),其它的值如下:
- UITableViewCellAccessoryDisclosureIndicator
- UITableViewCellAccessoryDatailDisclosureButton
- UITableViewCellAccessoryCheckmark
还有一些辅助的属性,可以设置cell的右边图标的,代码如下:
//初始化每一行要显示的内容 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease]; cell.textLabel.text = [self.data objectAtIndex:indexPath.row]; cell.imageView.image = [UIImage imageNamed:@"home.png"]; //改变cell右边的辅助属性 if (indexPath.row < 3) { cell.accessoryType = UITableViewCellAccessoryCheckmark; } else if (indexPath.row <7) { cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; } else{ cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } return cell; }
运行效果如下: