上篇博客大致讲解了UIScrollView的使用,相信大家对于UIScrolView已经有一定了解了。那其实在实际的开发中,我们使用更多的可能还是UITableView。学会使用UITableView还是非常重要的,今天就仔细讲解一下UITableview的实际使用。
1.先从最基本的使用开始。
首先要知道几个事情:(1)UITableView有两种样式:(普通样式)UITableViewStylePalin/(分组显示)UITableViewStyleGrouped
(2) UITableView是继承自UIScrollView的,所以UIScrollView的一些属性和方法也适用于UITableView。
(3)UITableView要显示数据必须要实现UITableViewDataSource代理
@required(必须实现)
》//返回每一部分有几行cell
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
》//每一行cell的具体显示
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
@optional(选择实现)
》//返回有几个部分,默认是1(如果不实现该方法)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
下面通过一个小例子实际使用一下UITableVIew,同时看一下两种样式的差别。
#import "ViewController.h"
@interface ViewController ()<UITableViewDataSource>
@property(nonatomic,strong)UITableView *tableView;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView=[[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStyleGrouped];
//self.tableView=[[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
self.tableView.contentInset=UIEdgeInsetsMake(20, 0, 0, 0);
self.tableView.dataSource=self;
[self.view addSubview:self.tableView];
}
#pragma mark -UITableViewDataSource
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 3;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 5;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellId=@"cellId";
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellId];
if(!cell)
{
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
}
cell.textLabel.text=@"测试文本";
return cell;
}
@end
实际效果:
Palin:
Grouped:
很明显:Palin样式并没有明显区分不同部分,而Grouped样式很明显有分组。
1)注意一点:UITableViewStylePalin样式在头部是没有一条直线的,而UITableViewStyle在每一部分的头部都有一条左边顶格的直线。可以根据实际需求来选择样式。
2)大家应该发现了不管哪一个样式,中间的每一条cell分割线都不是左边顶格的,那如何使其左边顶格呢?
-->首先对UITableView设置:
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
-->然后实现UITableViewDelegate代理
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
效果图如下:
有时候也可能不想要这个分割线,那就更简单了。一句话搞定:
self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone;
4.有时候会有这样一种情况,样式使用的是UITableviewStylePlain,但是显示的cell不没有占满整个屏幕,但是剩余屏幕会有多余的线,那如何删除这些多余线呢?
具体情景描述如下:
#import "ViewController.h"
@interface ViewController ()<UITableViewDataSource>
@property(nonatomic,strong)UITableView *tableView;
@property(nonatomic,strong)NSArray *dataSourceArray;
@end
@implementation ViewController
//懒加载
-(NSArray *)dataSourceArray
{
if(!_dataSourceArray)
{
_dataSourceArray=[[NSArray alloc]initWithObjects:@"1",@"2",@"3",@"4",@"5",@"6", nil];
}
return _dataSourceArray;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView=[[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain];
self.tableView.dataSource=self;
[self.view addSubview:self.tableView];
}
#pragma mark -UITableViewDataSource
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.dataSourceArray.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellId=@"cellId";
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellId];
if(!cell)
{
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
}
cell.textLabel.text=self.dataSourceArray[indexPath.row];
return cell;
}
@end
一句话搞定:
self.tableView.tableFooterView=[[UIView alloc]init];
上面的提到的其实并没有什么难度,都是实际开发中常遇到的小细节,不过所谓细节决定成败,这些东西还是要注意的。