关于iOS的tableView的cellForRowAtIndexPath

关于iOS的tableView的cellForRowAtIndexPath

 

 说明:

1. 如果是标准的cell,比如每个cell上的元素是一样的,那么可以直接利用缓存;

2.如果是非标准的cell,每个cell展示的元素会有差别,那么对这些有差别的视图组件要进行特殊处理。

2.1 特殊处理:

2.1.1 在缓存中获取到这些特殊的视图组件,必须将其从contentView中移除;

2.1.2 每次重新创建这些特殊视图组件(也就是说这些特殊元素是不能用缓存,否则会在界面上下滚动时候会发生错乱)。

 

3.添加到cell的contentView的子视图,必须为子视图定义唯一的tag属性,在获取缓存的时候可以通过tag属性进行相应的操作处理。

4. 在cell上进行操作后,例如改变了cell上显示的内容,必须去修改tableView对应的数据源,否则在滚动时发现已经修改掉的内容却还是显示出来。

 

#pragma mark - 绘制单元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //-------定义界面展示需要的视图组件------------------
    //时间和联赛
    UILabel* timeAndClubName;
    //主队和客队
    UIImageView* ivTeam1Icon;
    UIImageView* ivTeam2Icon;
    UILabel* lblTeam1Name;
    UILabel* lblTeam2Name;
    //关注按钮
    UIButton* btnAttention;
    //比分
    UILabel* lblScore;
    //直播频道
    UILabel* lblChannel;
    
    //定义缓存标记
    static NSString *identifier = @"cell_id";
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
        //-------创建界面展示需要的视图组件------------------
        //时间和联赛
        timeAndClubName = [[UILabel alloc]initWithFrame:CGRectMake(0, 20, cell.width, 10)];
        [timeAndClubName setFont:[UIFont systemFontOfSize:11]];
        timeAndClubName.textAlignment = NSTextAlignmentCenter;
        timeAndClubName.textColor = [UIColor lightGrayColor];
        timeAndClubName.tag=TAG_START_INDEX+1;
        
        //主队和客队
        ivTeam1Icon = [[UIImageView alloc] initWithFrame:CGRectMake(40, 20, 40, 40)];
        ivTeam1Icon.tag=TAG_START_INDEX+2;
        ivTeam2Icon = [[UIImageView alloc] initWithFrame:CGRectMake(cell.width-80, 20, 40, 40)];
        ivTeam2Icon.tag=TAG_START_INDEX+3;
        lblTeam1Name = [[UILabel alloc]initWithFrame:CGRectMake(0, ivTeam1Icon.bottom +5, 120, 20)];
        lblTeam1Name.tag=TAG_START_INDEX+4;
        lblTeam1Name.textAlignment = NSTextAlignmentCenter;
        [lblTeam1Name setFont:[UIFont systemFontOfSize:12]];
        lblTeam2Name = [[UILabel alloc]initWithFrame:CGRectMake(cell.width-120, ivTeam2Icon.bottom+5 , 120, 20)];
        lblTeam2Name.tag=TAG_START_INDEX+5;
        lblTeam2Name.textAlignment = NSTextAlignmentCenter;
        [lblTeam2Name setFont:[UIFont systemFontOfSize:12]];
        
        
        
        //直播频道
        lblChannel = [[UILabel alloc]initWithFrame:CGRectMake(0, timeAndClubName.bottom +50, 120, 20)];
        lblChannel.center = CGPointMake(cell.center.x, lblChannel.frame.origin.y);
        lblChannel.textAlignment = NSTextAlignmentCenter;
        [lblChannel setFont:[UIFont systemFontOfSize:11]];
        lblChannel.textColor = [UIColor lightGrayColor];
        lblChannel.tag=TAG_START_INDEX+8;

    }else{
        //-------从缓存中获取界面展示需要的视图组件------------------
        //时间和联赛
        timeAndClubName = (UILabel*)[cell.contentView viewWithTag:TAG_START_INDEX+1];
        //主队和客队
        ivTeam1Icon = (UIImageView*)[cell.contentView viewWithTag:TAG_START_INDEX+2];
        ivTeam2Icon = (UIImageView*)[cell.contentView viewWithTag:TAG_START_INDEX+3];
        lblTeam1Name = (UILabel*)[cell.contentView viewWithTag:TAG_START_INDEX+4];
        lblTeam2Name = (UILabel*)[cell.contentView viewWithTag:TAG_START_INDEX+5];
        
        //关注按钮
        UIView* view1 = [cell.contentView viewWithTag:TAG_START_INDEX+6];
        if (view1) {
            [view1 removeFromSuperview];
        }
        
        
        //比分
        UIView* view2 = [cell.contentView viewWithTag:TAG_START_INDEX+7];
        if (view2) {
            [view2 removeFromSuperview];
        }
        
        
        //直播频道
        lblChannel = (UILabel*)[cell.contentView viewWithTag:TAG_START_INDEX+8];
    }
    
    //----------关注按钮、比分 比较特殊(有些cell显示,有些不显示),因此每次需要重新创建 start----------------
    //关注按钮
    btnAttention = [UIButton buttonWithType:UIButtonTypeCustom];
    btnAttention.frame = CGRectMake((cell.width-25)/2, timeAndClubName.bottom +11, 25, 25);
    [btnAttention addTarget:self action:@selector(btnAttentionClick:) forControlEvents:UIControlEventTouchUpInside];
    btnAttention.tag=TAG_START_INDEX+6;
    //比分
    lblScore = [[UILabel alloc]initWithFrame:CGRectMake(0, timeAndClubName.bottom +30, 120, 20)];
    lblScore.center = CGPointMake(cell.center.x, lblScore.frame.origin.y);
    lblScore.textAlignment = NSTextAlignmentCenter;
    [lblScore setFont:[UIFont systemFontOfSize:18]];
    lblScore.tag=TAG_START_INDEX+7;
    //----------关注按钮、比分 比较特殊(有些cell显示,有些不显示),因此每次需要重新创建 end----------------
    
    //设置cell被选中的效果
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    //获取cell显示的数据源
    NSDictionary *option = [_dicData objectForKey:[_categoryArray objectAtIndex:indexPath.section]][indexPath.row];
//    UIView* mainView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, cell.width, cell.height)];
    
    //时间和联赛
    timeAndClubName.text=[NSString stringWithFormat:@"%@ %@",[[option objectForKey:@"time"] substringWithRange:NSMakeRange(11,5)],[option objectForKey:@"name"]];
    //主队和客队
    UIImage* placeHoldImage = [UIImage imageNamed:KGQ_DEFAULT_FOR_TEAM];
    [MyHttpRequest downloadImage:[[option objectForKey:@"team1"] objectForKey:@"icon"] andWithImageShower:ivTeam1Icon andWithPlaceHoldIMage:placeHoldImage andBlock:^(UIImage *image) {}];
    [MyHttpRequest downloadImage:[[option objectForKey:@"team2"] objectForKey:@"icon"] andWithImageShower:ivTeam2Icon andWithPlaceHoldIMage:placeHoldImage andBlock:^(UIImage *image) {}];
     
//    [ivTeam2Icon sd_setImageWithURL:[[option objectForKey:@"team2"] objectForKey:@"icon"] placeholderImage:[UIImage imageNamed:KGQ_DEFAULT_FOR_TEAM]];
    lblTeam1Name.text=[[option objectForKey:@"team1"] objectForKey:@"name"];
    lblTeam2Name.text=[[option objectForKey:@"team2"] objectForKey:@"name"];


    //关注按钮
    BOOL isAttention = [[option objectForKey:@"attention_state"] isEqualToString:@"0"] ? NO : YES;
    if (isAttention) {
        [btnAttention setImage:[UIImage imageNamed:KGQ_IMAGE_ATTENTION_YES] forState:UIControlStateNormal];
    }else{
        [btnAttention setImage:[UIImage imageNamed:KGQ_IMAGE_ATTENTION_NO] forState:UIControlStateNormal];
    }
    
    //比分
    lblScore.center = CGPointMake(cell.center.x, lblScore.frame.origin.y);
    lblScore.text=[NSString stringWithFormat:@"%@:%@",[[option objectForKey:@"team1"] objectForKey:@"score"],[[option objectForKey:@"team2"] objectForKey:@"score"]];
    
    /*
     “state”:”比赛状态(0=未开始,1=进行中,2=已结束)”
     */
    NSString* strState = [option objectForKey:@"state"];
    NSInteger state = [strState intValue];
    
    //直播频道
    lblChannel.text=[option objectForKey:@"channel"];
    if (state==2) {//比赛结束
        lblChannel.text=@"已完场";
    }
    
    //加入contentView
    if (state==0) {
        [cell.contentView addSubview:btnAttention];
    }else{
        [cell.contentView addSubview:lblScore];
    }
    [cell.contentView addSubview:ivTeam1Icon];
    [cell.contentView addSubview:ivTeam2Icon];
    [cell.contentView addSubview:timeAndClubName];
    [cell.contentView addSubview:lblTeam1Name];
    [cell.contentView addSubview:lblTeam2Name];
    [cell.contentView addSubview:lblChannel];

    return cell;
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值