Search code examples
iphonemultithreadinguitableviewasihttprequestuiprogressview

UIProgressView hides when scroll the tableview


In my iphone app i am having a button, when I click on the button, download operation starts and i am replacing the button with UIProgressView. This UIProgressView will show the download progress. But once a UIProgressView is added, when I scroll it is disappeared. Here is my code:

    // Customize the appearance of table view cells.
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier = @"Cell";

        UIMenuItemCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if(cell == nil)
            cell = [self getCellContentView:CellIdentifier];

        cell.cellitemImage = (UIImageView *)[cell viewWithTag:2];
        cell.cellItemButton = (UIButton *)[cell viewWithTag:3];

        DataBaseClass *itemObj = [appDelegate.itemArray objectAtIndex:indexPath.row];
        NSString *url;
        if([itemObj.itemStatus isEqualToString:@"Available"]){
            cell.cellItemButton.userInteractionEnabled = YES;
            cell.userInteractionEnabled = YES;
            [cell.cellItemButton setTitle:@"" forState:UIControlStateNormal];
            [cell.cellItemButton setBackgroundImage:[UIImage imageNamed:@"img_normal"] forState:UIControlStateNormal];
            [cell.cellItemButton setBackgroundImage:[UIImage imageNamed:@"img_pressed"] forState:UIControlStateHighlighted];
            [cell.cellItemButton addTarget:self action:@selector(download) forControlEvents:UIControlEventTouchUpInside];
            url = [NSString stringWithFormat:@"%@",itemObj.availableIcon];
        }else if([itemObj.itemStatus isEqualToString:@"Downloading"]){
            url = [NSString stringWithFormat:@"%@",itemObj.availableIcon];
            [cell.contentView addSubview:myprogressView];
            cell.cellItemButton.hidden = YES;
        }

        [cell.cellitemImage setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:@"item01.png"]];

        cell.cellItemName.text = [NSString stringWithFormat:@"%@",itemObj.itemName];

        return cell;
    }

- (void)download{
        UIButton *btn = (UIButton *)clickedBtnSender;
        UIMenuItemCell *cell = [(UIMenuItemCell *)[[clickedBtnSender superview] superview] retain];
         myprogressView = [[[CustomProgressView alloc]initWithFrame:CGRectMake(25, 140, 100, 21)] retain];
        myprogressView.tag = selectedTag;

        btn.hidden = YES;

        for (UIProgressView *currentProgress in cell.contentView.subviews) {
            if ([currentProgress isKindOfClass:[UIProgressView class]]){
                [currentProgress removeFromSuperview];
            }
        }

        [cell.contentView addSubview:myprogressView];
}

Please help.

EDIT

- (UIMenuItemCell *) getCellContentView:(NSString *)cellIdentifier {

    CGRect CellFrame = CGRectMake(0, 0, 150, 60);
    CGRect imgFrame = CGRectMake(20, 48, 110, 123);
    CGRect btnFrame = CGRectMake(25, 140, 100, 26);
    CGRect progressFrame = CGRectMake(25, 140, 100, 21);


    UIImageView *itemImg;
    UIButton *itemBtn;
    UIProgressView *itemProgView;

    UIMenuItemCell *cell = [[UIMenuItemCell alloc] init] ;
    cell.frame = CellFrame;

    //Initialize ImageView
    itemImg = [[UIImageView alloc]initWithFrame:imgFrame];
    itemImg.tag = 2;
    [cell.contentView addSubview:itemImg];

    //Initialize Button
    itemBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    itemBtn.frame = btnFrame;
    itemBtn.tag = 3;
    itemBtn.titleLabel.textColor = [UIColor blueColor];
    itemBtn.titleLabel.font = [UIFont systemFontOfSize:9.0];
    [cell.contentView addSubview:itemBtn];

    //Initialize ProgressView
    itemProgView = [[CustomProgressView alloc]initWithFrame:progressFrame];
    itemProgView.tag = 4;
    //[cell.contentView addSubview:itemProgView];

    return cell;
}

Solution

  • I think you need to have unique cellIdentifier for each cell

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
            NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d", indexPath.row];
    
            UIMenuItemCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
            if(cell == nil) {
                cell = [self getCellContentView:CellIdentifier];
    
                // Some codes here
            }
    
           return cell;
    }
    

    Additional based on you last edit

    Change

    UIMenuItemCell *cell = [[UIMenuItemCell alloc] init];
    

    to

    UIMenuItemCell *cell = [[UIMenuItemCell alloc] initWithFrame:CellFrame reuseIdentifier:cellIdentifier];