代码改变世界

UITableView的简单使用

2015-09-29 15:13  樊小志  阅读(550)  评论(0编辑  收藏  举报

UITableView分为两种style:UITableViewStyleGrouped和UITableViewStylePlain。

(一)UITableViewStyleGrouped

#import "ViewController.h"
//行高
#define cellHeight 60
//边距
#define margin 10
@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
    UITableView *myTableView;
    NSArray *myData;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    myTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStyleGrouped];
    myTableView.dataSource = self;
    myTableView.delegate = self;
    //默认分隔线设置为无
    myTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    [self.view addSubview:myTableView];
    [self initWithData];
}
- (void)initWithData
{
    myData = @[
               @{
                   @"city":@"北京",
                   @"cityfooter":@"我是北京",
                   @"district":@[@"朝阳区",@"海淀区"],
                   @"districtdetail":@[@"我是朝阳区",@"我是海淀区"],
                   @"image":@[@"1",@"2"],
                   },
               @{
                   @"city":@"上海",
                   @"cityfooter":@"我是上海",
                   @"district":@[@"徐汇区",@"闵行区",@"浦东新区"],
                   @"districtdetail":@[@"我是徐汇区",@"我是闵行区",@"我是浦东新区"],
                   @"image":@[@"1",@"2",@"3"],
                   },
               ];
}

#pragma mark --------------tableviewDataSource---------------
//组数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return myData.count;
}
//每组的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [[myData[section] objectForKey:@"district"] count];
}
//组头
- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    return [myData[section] objectForKey:@"city"];
}
//组尾
- (nullable NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
{
    return [myData[section] objectForKey:@"cityfooter"];
}
//设置行数据
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellString = @"cellString";//cell的重用
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellString];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellString];
        
        UIImageView *cellImageView = [[UIImageView alloc]initWithFrame:CGRectMake(margin, margin, cellHeight-margin*2, cellHeight-margin*2)];
        cellImageView.backgroundColor = [UIColor brownColor];
        cellImageView.tag = 101;
        [cell addSubview:cellImageView];
        
        UILabel *cellText = [[UILabel alloc]initWithFrame:CGRectMake(CGRectGetMaxX(cellImageView.frame)+margin, margin, self.view.frame.size.width-(CGRectGetMaxX(cellImageView.frame)+margin), 20)];
        cellText.tag = 102;
        [cell addSubview:cellText];
        
        UILabel *cellDetailText = [[UILabel alloc]initWithFrame:CGRectMake(cellText.frame.origin.x, CGRectGetMaxY(cellText.frame)+5, cellText.frame.size.width, 20)];
        cellDetailText.textColor = [UIColor lightGrayColor];
        cellDetailText.tag = 103;
        [cell addSubview:cellDetailText];
        //设置点选效果为无
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        //设置行右边的箭头
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    //图标
    UIImageView *cellImageView = (UIImageView *)[cell viewWithTag:101];
    cellImageView.image = [UIImage imageNamed:[myData[indexPath.section] objectForKey:@"image"][indexPath.row]];
    
    //标题
    UILabel *cellText = (UILabel *)[cell viewWithTag:102];
    cellText.text = [myData[indexPath.section] objectForKey:@"district"][indexPath.row];
    [self getHeightWithLabel:cellText andFontSize:15];

    //副标题
    UILabel *cellDetailText = (UILabel *)[cell viewWithTag:103];
    cellDetailText.text = [myData[indexPath.section] objectForKey:@"districtdetail"][indexPath.row];
    cellDetailText.frame = CGRectMake(cellText.frame.origin.x, CGRectGetMaxY(cellText.frame)+5, cellText.frame.size.width, 20);
    [self getHeightWithLabel:cellDetailText andFontSize:13];
    
    //分隔线
    UIImageView *lineImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, cellHeight-1, self.view.frame.size.width, 1)];
    [lineImageView setBackgroundColor:[UIColor colorWithRed:234.0/255.0 green:234.0/255.0 blue:234.0/255.0 alpha:1.0]];
    [cell addSubview:lineImageView];
    
    return cell;
}
#pragma mark ---------------tableviewDelegate------------------
//设置行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return cellHeight;
}
//点击事件
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //这里写点击方法
    NSLog(@"点击了第%li组第%li行",(long)indexPath.section,(long)indexPath.row);
}
//UIlabel自适应高
- (void)getHeightWithLabel:(UILabel *)label andFontSize:(CGFloat)size
{
    label.numberOfLines = 0;
    NSMutableAttributedString *labelString = [[NSMutableAttributedString alloc] initWithString:label.text];
    [labelString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:size] range:NSMakeRange(0, [labelString length])];
    CGRect labelStringRect = [labelString boundingRectWithSize:CGSizeMake(self.view.frame.size.width-label.frame.origin.x*2, 9999) options:NSStringDrawingUsesLineFragmentOrigin context:nil];
    CGRect labelRect = label.frame;
    labelRect.size.height = labelStringRect.size.height;
    label.frame = labelRect;
    label.attributedText = labelString;
}

(二)UITableViewStylePlain

#import "ViewController.h"
//行高
#define cellHeight 60
//边距
#define margin 10
@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
{
    UITableView *myTableView;
    NSArray *myData;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    myTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStylePlain];
    myTableView.dataSource = self;
    myTableView.delegate = self;
    //默认分隔线设置为无
    myTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    [self.view addSubview:myTableView];
    [self initWithData];
}
- (void)initWithData
{
//此数组格式类似于网络开发用到过的Json格式
    myData = @[
               @{
                   @"city":@"北京",
                   @"district":@"朝阳区",
                   @"districtdetail":@"我是朝阳区",
                   @"image":@"1",
                   },
               @{
                   @"city":@"北京",
                   @"district":@"海淀区",
                   @"districtdetail":@"我是海淀区",
                   @"image":@"2",
                   },
               @{
                   @"city":@"上海",
                   @"district":@"徐汇区",
                   @"districtdetail":@"我是徐汇区",
                   @"image":@"1",
                   },
               @{
                   @"city":@"上海",
                   @"district":@"闵行区",
                   @"districtdetail":@"我是闵行区",
                   @"image":@"2",
                   },
               @{
                   @"city":@"上海",
                   @"district":@"浦东新区",
                   @"districtdetail":@"我是浦东新区",
                   @"image":@"3",
                   },
               ];
}

#pragma mark --------------tableviewDataSource---------------
//组数(UITableViewStylePlain样式默认为1)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
//行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [myData count];
}
//设置行数据
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellString = @"cellString";//cell的重用
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellString];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellString];
        
        UIImageView *cellImageView = [[UIImageView alloc]initWithFrame:CGRectMake(margin, margin, cellHeight-margin*2, cellHeight-margin*2)];
        cellImageView.backgroundColor = [UIColor brownColor];
        cellImageView.tag = 101;
        [cell addSubview:cellImageView];
        
        UILabel *cellText = [[UILabel alloc]initWithFrame:CGRectMake(CGRectGetMaxX(cellImageView.frame)+margin, margin, self.view.frame.size.width-(CGRectGetMaxX(cellImageView.frame)+margin), 20)];
        cellText.tag = 102;
        [cell addSubview:cellText];
        
        UILabel *cellDetailText = [[UILabel alloc]initWithFrame:CGRectMake(cellText.frame.origin.x, CGRectGetMaxY(cellText.frame)+5, cellText.frame.size.width, 20)];
        cellDetailText.textColor = [UIColor lightGrayColor];
        cellDetailText.tag = 103;
        [cell addSubview:cellDetailText];
        
        UILabel *cellIntroduceText = [[UILabel alloc]initWithFrame:CGRectMake(CGRectGetMaxX(cellDetailText.frame)+margin, (cellHeight-20)/2, self.view.frame.size.width-(CGRectGetMaxX(cellDetailText.frame)+margin), 20)];
        cellIntroduceText.textColor = [UIColor darkGrayColor];
        cellIntroduceText.tag = 104;
        [cell addSubview:cellIntroduceText];
        //设置点选效果为无
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        //设置行右边的箭头
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
    //图标
    UIImageView *cellImageView = (UIImageView *)[cell viewWithTag:101];
    cellImageView.image = [UIImage imageNamed:[myData[indexPath.row] objectForKey:@"image"]];
    
    //标题
    UILabel *cellText = (UILabel *)[cell viewWithTag:102];
    cellText.text = [myData[indexPath.row] objectForKey:@"city"];
    [self getHeightWithLabel:cellText andFontSize:15];

    //副标题
    UILabel *cellDetailText = (UILabel *)[cell viewWithTag:103];
    cellDetailText.text = [myData[indexPath.row] objectForKey:@"district"];
    cellDetailText.frame = CGRectMake(cellText.frame.origin.x, CGRectGetMaxY(cellText.frame)+5, cellText.frame.size.width, 20);
    [self getHeightWithLabel:cellDetailText andFontSize:13];
    [self getWidthWithLabel:cellDetailText andFontSize:13];
    
    //介绍信息
    UILabel *cellIntroduceText = (UILabel *)[cell viewWithTag:104];
    cellIntroduceText.text = [myData[indexPath.row] objectForKey:@"districtdetail"];
    cellIntroduceText.frame = CGRectMake(CGRectGetMaxX(cellDetailText.frame)+margin, (cellHeight-20)/2, self.view.frame.size.width-(CGRectGetMaxX(cellDetailText.frame)+margin), 20);
    
    //分隔线
    UIImageView *lineImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, cellHeight-1, self.view.frame.size.width, 1)];
    [lineImageView setBackgroundColor:[UIColor colorWithRed:234.0/255.0 green:234.0/255.0 blue:234.0/255.0 alpha:1.0]];
    [cell addSubview:lineImageView];
    
    return cell;
}
#pragma mark ---------------tableviewDelegate------------------
//设置行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return cellHeight;
}
//点击事件
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //这里写点击方法
    NSLog(@"点击了第%li行",(long)indexPath.row);
}
//UIlabel自适应高
- (void)getHeightWithLabel:(UILabel *)label andFontSize:(CGFloat)size
{
    label.numberOfLines = 0;
    NSMutableAttributedString *labelString = [[NSMutableAttributedString alloc] initWithString:label.text];
    [labelString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:size] range:NSMakeRange(0, [labelString length])];
    CGRect labelStringRect = [labelString boundingRectWithSize:CGSizeMake(self.view.frame.size.width-label.frame.origin.x*2, 9999) options:NSStringDrawingUsesLineFragmentOrigin context:nil];
    CGRect labelRect = label.frame;
    labelRect.size.height = labelStringRect.size.height;
    label.frame = labelRect;
    label.attributedText = labelString;
}
//UIlabel自适应宽
- (void)getWidthWithLabel:(UILabel *)label andFontSize:(CGFloat)size
{
    label.numberOfLines = 0;
    NSMutableAttributedString *labelString = [[NSMutableAttributedString alloc] initWithString:label.text];
    [labelString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:size] range:NSMakeRange(0, [labelString length])];
    CGRect labelStringRect = [labelString boundingRectWithSize:CGSizeMake(9999, label.frame.size.height) options:NSStringDrawingUsesLineFragmentOrigin context:nil];
    CGRect labelRect = label.frame;
    labelRect.size.width = labelStringRect.size.width;
    label.frame = labelRect;
    label.attributedText = labelString;
}