如果第一次填充,如何限制表格视图第二次填充单元格

Posted

技术标签:

【中文标题】如果第一次填充,如何限制表格视图第二次填充单元格【英文标题】:How restrict tableview to fill cell second time if it filled first time 【发布时间】:2013-03-22 07:03:27 【问题描述】:

在我的 TableView 中,我正在设置图像和两个标签,它填充得很好。但是当我向下滚动 TableView 然后重新查看填充的单元格时,它将重新填充。现在我正在用来自 URL 的图像填充我的 ImageView,这样它就会为我的用户创建负载。

所以我可以限制我的 TableView,如果我的单元格第一次被填充,它将不会再次填充。

这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)atableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";

    UITableViewCell * cell = [atableView  dequeueReusableCellWithIdentifier: nil];

    if(cell == nil) 

        cell = [[UITableViewCell alloc]
                initWithStyle:UITableViewCellStyleDefault
                reuseIdentifier:SimpleTableIdentifier];

        ChannelList *channelList = nil;
        if (searchedData.count ==0) 
            channelList = [channelAllData objectAtIndex:[indexPath section]];
         else 
            channelList = [searchedData objectAtIndex:[indexPath section]];
        


        UIImageView *aImageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 10, 50, 50)];
        aImageView.image = [UIImage imageNamed:@"tv-defolt.png"];
        NSString * mystr = [channelList channelLogo];

        if (mystr.length !=0) 
            //get a dispatch queue
            dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
            //this will start the image loading in bg
            dispatch_async(concurrentQueue, ^
                NSString * str = [NSString stringWithFormat:@"http://manektech.net/mttv/Channel/%@",[channelList channelLogo]];
                NSData *image = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:str]];

                //this will set the image when loading is finished
                dispatch_async(dispatch_get_main_queue(), ^
                    aImageView.image = [UIImage imageWithData:image];
                );
            );
         else 
            aImageView.image = [UIImage imageNamed:@"tv-defolt.png"];
        

        [cell addSubview:aImageView];


        UILabel *nameTextLabel =  [[UILabel alloc] initWithFrame: CGRectMake(80, 15, 175, 20)];
        nameTextLabel.textColor = [UIColor blackColor];
        nameTextLabel.backgroundColor = [UIColor clearColor];
        nameTextLabel.text = [channelList channelName];
        nameTextLabel.font = [UIFont fontWithName:@"Arial" size:14];
        [cell addSubview:nameTextLabel];

        UILabel *genreTextLabel =  [[UILabel alloc] initWithFrame: CGRectMake(80, 35, 175, 20)];
        genreTextLabel.textColor = [UIColor grayColor];
        genreTextLabel.backgroundColor = [UIColor clearColor];

        NSString * str = [NSString stringWithFormat:@"%@ | %@",[channelList channelType],[channelList channelCounry]];

        genreTextLabel.text = str;
        genreTextLabel.font = [UIFont fontWithName:@"Arial" size:14];
        [cell addSubview:genreTextLabel];


    cell.selectionStyle = UITableViewCellSelectionStyleGray;


    
    return cell;


【问题讨论】:

【参考方案1】:
- (UITableViewCell *)tableView:(UITableView *)atableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


     NSString *SimpleTableIdentifier = [NSString stringWithFormat:@"Cell%d%d",indexPath.section,indexPath.row]; /// set different idenfifier for all cell

    UITableViewCell * cell = [atableView  dequeueReusableCellWithIdentifier: SimpleTableIdentifier];
    if (cell == nil) 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:SimpleTableIdentifier] autorelease];
        /// Add UIImageView and UILable here 
        

【讨论】:

使用 SDWebImage 代替惰性表会更好。 试试吧,这对于 AsynImage 很有用,它在后台下载图像并存储在我们的目录中,但这是仅在第一次加载该单元格时再次加载该单元格时未加载的逻辑 @PingDanehog 也看看你的问题,你的问题是我的手机负载只是第一次所以我发布这个答案...... 是的,您的回答有帮助 +1。但我认为如果 SDWebImage 能帮助我减少我的应用程序下载或我正在使用的方法会更好。 很好的答案,我已经检查过我的单元格将使用 log 第二次调用 imageurl 。但事实并非如此。所以它不会使用额外的网络下载。这对我来说更好。【参考方案2】:

您应该使用SDWebImage 来避免延迟表滚动。 它使用缓存并避免每次都请求图像 URL。

【讨论】:

【参考方案3】:

在两者之间创建您的 UILabelUIImageview

if(cell == nil) 

    cell = [[UITableViewCell alloc]
                initWithStyle:UITableViewCellStyleDefault

  .
  .
  .

    // create `UILabel` and `UIImageview`  here add add it to cell.contentView

两者都在cell.contentView

【讨论】:

使用 SDWebImage 代替惰性表会更好。

以上是关于如果第一次填充,如何限制表格视图第二次填充单元格的主要内容,如果未能解决你的问题,请参考以下文章

第二次渲染后表格列宽发生变化 - JQuery DataTables

NSMutableArray 为表格视图填充太晚

excel单元格怎么快速填充颜色?

专门更改填充了数组元素的表格视图中的一个单元格

解析对象数组并填充表格视图单元格 Swift

使用单击子视图中的表格单元格来填充视图中的字段