表视图继承自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 : NSObject2 3 @property (nonatomic,retain)NSString *name;4 @property (nonatomic,retain)NSString *role;5 @property (nonatomic,retain)NSNumber *number;
HBPlayerInfo.m文件 1 @implementation HBPlayerInfo2 3 @synthesize name=_name;4 @synthesize role=_role;5 @synthesize number=_number;
随后在UITableViewControll的子类取名SimpleTabelViewController,对于头文件,声明如下:
//SimpleTableViewContoller.h @interface HBSimpleTableViewController : UITableViewController{ //数据源 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)initData19 {20 NSMutableArray *arrPlayer=[NSMutableArray arrayWithCapacity:0];21 NSArray *arrPlist=nil;22 //读取工程中的球员信息plist23 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)initUI45 {46 self.tableView.allowsSelection=NO;47 }48 49 -(NSString *)title50 {51 return @"广州恒大俱乐部";52 }53 54 - (void)didReceiveMemoryWarning55 {56 [super didReceiveMemoryWarning];57 // Dispose of any resources that can be recreated.58 }59 60 #pragma mark - Table view data source61 62 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView63 {64 #warning Potentially incomplete method implementation.65 // Return the number of sections.66 return 1;67 }68 69 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section70 {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 *)indexPath78 {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需要的Cell94 return cell;95 }
注:每个UITableCell都拥有一个用作重用的ID,上述代码中我们取名叫SimpleTableViewCellId.当在滚动的过程中需要显示新一行时,新行会使用不显示的旧行的Cell对象修改内容后再次显示。当既要显示的Cell跑进“cellForRowAtIndexPath”回调函数的时候,“dequeueReusableCellWithIdentifier”方法返回的就是第一个Cell对象而不再需要新建内存,开发者只需要在第一个Cell上进行内容的重新配置后即可
效果图: