iOS开发基础-UITableView控件简单介绍

   UITableView 继承自 UIScrollView ,用于实现表格数据展示,支持垂直滚动。

   UITableView 需要一个数据源来显示数据,并向数据源查询一共有多少行数据以及每一行显示什么内容等。凡是遵守 UITableViewDataSource 协议的Objc对象,都可以是 UITableView 的数据源。

   - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  返回共有多少组数据。

   - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  返回每一组有多少行数据。

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  返回每一行显示的内容。

   - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section  返回各组底部显示的标题。

   - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section  返回各组头部显示的标题。

 

实例

  新建一个Single View Application,命名为TableViewDemo,首先让 ViewController 类遵守 UITableViewDataSource 协议,并声明一个 UITableView 属性,如下所示:

1 //ViewController.m
2 @interface ViewController () <UITableViewDataSource>
3 @property (weak, nonatomic) IBOutlet UITableView *tableView;
4 @end

  将Table View视图拖到storyboard中,并将其与 tableView 属性建立关联。

  接下来设置 tableView 的数据源,修改 viewDidLoad 方法:

1 //ViewController.m
2 - (void)viewDidLoad {
3     [super viewDidLoad];
4     self.tableView.dataSource = self;
5 }

  重写 UITableViewDataSource 协议的方法:

 1 #pragma mark - UITableViewDataSource
 2 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
 3     NSLog(@"%s", __FUNCTION__);
 4     return 2;
 5 }
 6 
 7 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 8     NSLog(@"%s", __FUNCTION__);
 9     if (section == 0) {
10         return 2;
11     } else {
12         return 3;
13     }
14 }
15 
16 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
17     NSLog(@"%s %d %d", __FUNCTION__, indexPath.section, indexPath.row);
18     UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
19     if (indexPath.section == 0) {
20         if (indexPath.row == 0) {
21             cell.textLabel.text = @"奥迪";
22         } else if (indexPath.row == 1) {
23             cell.textLabel.text = @"宝马";
24         }
25     } else if (indexPath.section == 1) {
26         if (indexPath.row == 0) {
27             cell.textLabel.text = @"本田";
28         } else if (indexPath.row == 1) {
29             cell.textLabel.text = @"丰田";
30         } else if (indexPath.row == 2) {
31             cell.textLabel.text = @"马自达";
32         }
33     }
34     return cell;
35 }
36 
37 - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
38     if (section == 0) {
39         return @"高端大气上档次";
40     } else {
41         return @"还不错";
42     }
43 }
44 
45 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
46     if (section == 0) {
47         return @"德系品牌";
48     } else {
49         return @"日韩品牌";
50     }
51 }

   UITableViewCell 有一个 UITableViewCellStyle 属性,用于觉得其 contentView 使用哪些子类型,该属性定义如下:

1 typedef enum : NSInteger {
2    UITableViewCellStyleDefault,
3    UITableViewCellStyleValue1,
4    UITableViewCellStyleValue2,
5    UITableViewCellStyleSubtitle 
6 } UITableViewCellStyle;

 


 

  为显示的内容按组建立数据模型类,命名为 WJQCarGroup ,声明下列属性:

1 //WJQCarGroup.h
2 @interface WJQCarGroup : NSObject
3 @property (nonatomic, copy) NSString *title;
4 @property (nonatomic, copy) NSString *desc;
5 @property (nonatomic, strong) NSArray *cars;    //当前组所有行的数据
6 @end

  接下来在 ViewController.m 文件中导入 WJQCarGroup.h ,并在类扩展中声明 NSArray 属性用来存放所有组的数据,如下:

1 //ViewController.m
2 @interface ViewController () <UITableViewDataSource>
3 @property (weak, nonatomic) IBOutlet UITableView *tableView;
4 @property (nonatomic, strong) NSArray *carGroups;   //保存所有组的数据
5 @end

  使用懒加载技术重写 carGroups 属性的 getter 方法,如下:

 1 //ViewController.m
 2 #pragma mark - 懒加载
 3 - (NSArray *)carGroups {
 4     if (_carGroups == nil) {
 5         WJQCarGroup *cg1 = [[WJQCarGroup alloc] init];
 6         cg1.title = @"德系品牌";
 7         cg1.desc = @"高端大气上档次";
 8         cg1.cars = @[@"奥迪", @"宝马"];
 9         
10         WJQCarGroup *cg2 = [[WJQCarGroup alloc] init];
11         cg2.title = @"日韩系列";
12         cg2.desc = @"还不错";
13         cg2.cars = @[@"本田", @"丰田"];
14         
15         WJQCarGroup *cg3 = [[WJQCarGroup alloc] init];
16         cg3.title = @"欧美品牌";
17         cg3.desc = @"价格昂贵";
18         cg3.cars = @[@"劳斯莱斯", @"布加迪", @"小米"];
19         _carGroups = @[cg1, cg2, cg3];
20     }
21     return _carGroups;
22 }

  最后,修改 UITableViewDataSource 协议的相关方法:

 1 //ViewController.m
 2 #pragma mark - UITableViewDataSource
 3 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
 4     NSLog(@"%s", __FUNCTION__);
 5     return self.carGroups.count;
 6 }
 7 
 8 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 9     NSLog(@"%s", __FUNCTION__);
10     WJQCarGroup *carGroup = self.carGroups[section];
11     return carGroup.cars.count;
12 }
13 
14 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
15     NSLog(@"%s %d %d", __FUNCTION__, indexPath.section, indexPath.row);
16     UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
17     WJQCarGroup *carGroup = self.carGroups[indexPath.section];
18     NSString *carName = carGroup.cars[indexPath.row];
19     cell.textLabel.text = carName;
20     return cell;
21 }
22 
23 - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
24     WJQCarGroup *carGroup = self.carGroups[section];
25     return carGroup.desc;
26 }
27 
28 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
29     WJQCarGroup *carGroup = self.carGroups[section];
30     return carGroup.title;
31 }

 

参考博客:iOS开发UI篇—UITableview控件简单介绍

实例代码:http://vdisk.weibo.com/s/DiY98QyXCOne0

 

1 //ViewController.m
2 #pragma mark - 控制状态栏是否显示
3 - (BOOL)prefersStatusBarHidden {
4     //返回YES代表隐藏状态栏,NO相反
5     return YES;
6 }

 

posted @ 2016-02-22 21:27  pestle  阅读(286)  评论(0编辑  收藏  举报