表视图继承自UIScrollView,所以有着大多UIScrollView的操作特性,诸如手指控制内容的滚动,内容视图到顶端或者低端时的自动反弹等。配合UINavigationController的导航特性,表视图可以将大量有一定规则顺序的数据,完整的呈现到客户端上。
一般,开发者可以将UITableView的datasource和delegate对象设置成同一个控制器对象,delegate的回调函数并非强制实现,如果控制器没有特别实现代理回调函数的话,UITableView将用默认的值代替,比如默认无页眉页脚,默认点击UITableViewCell时不做任何处理等。
但是datasource却不同,想要正常显示一个UITableView,作为datasource的对象需要强制地实现两个回调方法。
-(NSInteger)tableView:(UITableViewView *)tableView numberOfRowsInSection:(NSInteger)section
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
表视图的使用最适合的场景时数据列表,我们以一份恒大足球队的球员名单来做示例,数据存储用苹果程序最喜欢的plist文件格式记录。如下图:
每个球员一共有三个信息:球衣号码,球员名字和角色
在具体工作开展之前,有必要为这个结构声明一个数据模型,代码如下:
HBPlayerInfo.h文件
1 @interface HBPlayerInfo : NSObject
2
3 @property (nonatomic,retain)NSString *name;
4 @property (nonatomic,retain)NSString *role;
5 @property (nonatomic,retain)NSNumber *number;
HBPlayerInfo.m文件
1 @implementation HBPlayerInfo
2
3 @synthesize name=_name;
4 @synthesize role=_role;
5 @synthesize number=_number;
随后在UITableViewControll的子类取名SimpleTabelViewController,对于头文件,声明如下:
//SimpleTableViewContoller.h
@interface HBSimpleTableViewController : UITableViewController<UITableViewDataSource,UITableViewDelegate>
{
//数据源
NSArray *_datasource;
}
@property (nonatomic ,readonly, retain) NSArray *datasource;
//数据源赋值
-(void)initData;
//界面配置
-(void)initUI;
//UIViewController的标题
-(NSString *)title;
头文件声明了2个初始化的方法,对于数据源的初始化内容,有必要现将记录所有队员信息的plist加入到工程中去,并且读取出来,撰写如下代码
1 - (void)viewDidLoad
2 {
3 [super viewDidLoad];
4
5 // Uncomment the following line to preserve selection between presentations.
6 // self.clearsSelectionOnViewWillAppear = NO;
7
8 // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
9 // self.navigationItem.rightBarButtonItem = self.editButtonItem;
10 self.tableView.dataSource=self;
11 self.tableView.delegate=self;
12 [self initData];
13 [self initUI];
14
15 self.navigationItem.title=[self title];
16 }
17
18 -(void)initData
19 {
20 NSMutableArray *arrPlayer=[NSMutableArray arrayWithCapacity:0];
21 NSArray *arrPlist=nil;
22 //读取工程中的球员信息plist
23 arrPlist=[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"hengda" ofType:@"plist"]];
24
25 HBPlayerInfo *onePlayer=nil;
26 //将信息挨个解析到数据模型中
27 for(NSDictionary *onePlayerInfo in arrPlist)
28 {
29 onePlayer=[[HBPlayerInfo alloc]init];
30 onePlayer.name=[onePlayerInfo objectForKey:@"name"];
31 onePlayer.role=[onePlayerInfo objectForKey:@"role"];
32 onePlayer.number=[onePlayerInfo objectForKey:@"number"];
33 [arrPlayer addObject:onePlayer];
34 }
35
36 //数据的赋值
37 if(_datasource!=nil)
38 {
39 _datasource=nil;
40 }
41 _datasource=[[NSArray alloc]initWithArray:arrPlayer];
42 }
43
44 -(void)initUI
45 {
46 self.tableView.allowsSelection=NO;
47 }
48
49 -(NSString *)title
50 {
51 return @"广州恒大俱乐部";
52 }
53
54 - (void)didReceiveMemoryWarning
55 {
56 [super didReceiveMemoryWarning];
57 // Dispose of any resources that can be recreated.
58 }
59
60 #pragma mark - Table view data source
61
62 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
63 {
64 #warning Potentially incomplete method implementation.
65 // Return the number of sections.
66 return 1;
67 }
68
69 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
70 {
71 #warning Incomplete method implementation.
72 // Return the number of rows in the section.
73 return self.datasource.count;
74 }
75
76
77 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
78 {
79 static NSString *CellIdentifier=@"SimpleTableViewCellId";
80 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
81
82 // Configure the cell...
83 if(cell==nil)
84 {
85 cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
86 }
87
88 //配置Cell的内容
89 HBPlayerInfo *onePlayer=[self.datasource objectAtIndex:indexPath.row];
90 if (onePlayer) {
91 cell.textLabel.text=onePlayer.name;
92 }
93 //提供UITableView需要的Cell
94 return cell;
95 }
注:每个UITableCell都拥有一个用作重用的ID,上述代码中我们取名叫SimpleTableViewCellId.当在滚动的过程中需要显示新一行时,新行会使用不显示的旧行的Cell对象修改内容后再次显示。当既要显示的Cell跑进“cellForRowAtIndexPath”回调函数的时候,“dequeueReusableCellWithIdentifier”方法返回的就是第一个Cell对象而不再需要新建内存,开发者只需要在第一个Cell上进行内容的重新配置后即可
效果图: