iOS UItableviewCell清除旧单元格值

时间:2017-08-04 11:09:15

标签: ios objective-c uitableview

首先很抱歉问这个,因为我知道有很多类似的问题。但到目前为止,没有什么对我有用。我有一个带两个按钮的表格视图。单击该按钮,它将加载两个不同的自定义单元格。但无论我尝试什么,我似乎无法清除旧的细胞价值。我已经尝试了prepareForReuse方法来清除旧视图,但我最终没有在单元格上显示任何内容。

以下是我正在使用的代码。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if([[self.sections objectAtIndex:indexPath.section] count] > 0)
        {
            id object = [[self.sections objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
            if (indexPath.section == self.sections.count-1)
            {
                if(self.CategoryButtonType == 0)
                {
                    MediaListCarousel * cell = [self getMediaCellCarousel:object];
                        return cell;
                }
                else
                {
                     NonMediaTableViewCell * cell = [self getNonMediaCell:object];
                      return cell;
                }
            }
            else 
            {
                 //Do other stuff
            }
        }
        return nil;
    }

以下是自定义单元格

-(NonMediaTableViewCell *)getNonMediaCell:(NSString *)name
{
    NonMediaTableViewCell * cell = [self.tableView dequeueReusableCellWithIdentifier:nonmediaCellIdentifier];
    if (cell == nil) {
        cell = (NonMediaTableViewCell*)[VFHelper findCellWithClassName:[NonMediaTableViewCell class] nibName:@"NonMediaTableViewCell"];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    [cell setNonMediaWithPackageName:name
                                         delegate:self];
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    return cell;
}


-(MediaListCarousel *)getMediaCellCarousel:(NSString *)name
{
    MediaListCarousel * cell = [self.tableView dequeueReusableCellWithIdentifier:mediaCellIdentifier];
    if (cell == nil) {
        cell = (MediaListCarousel*)[VFHelper findCellWithClassName:[MediaListCarousel class] nibName:@"MediaListCarousel"];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    [cell setUp:name delegate:self];
    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
    return cell;
}

每个自定义单元格都有如下定义的prepareForReuse方法。

- (void)prepareForReuse {
    [super prepareForReuse];
    // Clear contentView
    BOOL hasContentView = [self.subviews containsObject:self.contentView];
    if (hasContentView) {
        for(UIView *subview in [self.contentView subviews])
        {
            [subview removeFromSuperview];
        }
    }
}

当我在prepareForReuse方法中添加removeFromSuperview时发生的事情当我在两个视图之间切换时,我可以清空视图。如果我不使用prepareForReuse删除视图,当我单击不同的按钮时,我最终会看到彼此的视图。有人可以帮忙解决这个问题。提前谢谢。

编辑显示自定义单元格代码

-(void) getNonMediaCell:(NSString *)package
                                      delegate:(NSObject <nonMediaCellDelegate> *)delegate
{
    self.package = package;
    [self loadValuefFromDB];
    self.addonName = addonName;

    _delegate = delegate;
    [self.btnSeemore addTarget:self action:@selector(btnSeemoreClicked) forControlEvents:UIControlEventTouchUpInside];
    if(_addons.isHidden)
    {
        _planDescTextView.hidden = YES;
        _heightConstraintforPlanDescView.constant = 0;
        _btnSeemore.imageView.transform = CGAffineTransformIdentity;
    }
    else
    {
        _planDescTextView.text = description;
        CGSize neededSize = [_planDescTextView sizeThatFits:CGSizeMake(_planDescTextView.frame.size.width, CGFLOAT_MAX)];
        _planDescTextView.hidden = NO;
        _heightConstraintforPlanDescView.constant = neededSize.height + 5;
        _btnSeemore.imageView.transform = CGAffineTransformMakeRotation(M_PI);
        _btnSeemore.imageView.clipsToBounds = NO;
        _btnSeemore.imageView.contentMode = UIViewContentModeCenter;
    }

    if(IsEmpty(addons.state))
    {
        _UIViewEntitlement.hidden = YES;
        _UIViewBtnRepurchase.hidden = YES;
        _seperatorView.hidden = YES;
        [self resetCell];
        [self setPriceLabelValue];
        [self.purchaseBtn addTarget:self action:@selector(buttonClicked) forControlEvents:UIControlEventTouchUpInside];
        self.purchaseBtn.accessibilityLabel = [NSString stringWithFormat:@"%@_Purcahse", addonName];
        self.purchaseBtn.accessibilityValue = [NSString stringWithFormat:@"%@_Purcahse", addonName];
        self.purchaseBtn.accessibilityIdentifier = [NSString stringWithFormat:@"%@_Purcahse", addonName];
        self.recurringIndicatorImageView.hidden = NO;
        [self addOnRecurringIndicatorImages];
    }
    else
    {
        _UIViewEntitlement.hidden = NO;
        UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, 20)];
        VFAddonPlanentitlementCell * cell = (VFAddonPlanentitlementCell*)[VFHelper findCellWithClassName:[VFAddonPlanentitlementCell class] nibName:@"VFAddonPlanentitlementCell"];
        [cell setFrame:CGRectMake(0, 0, self.frame.size.width, 20)];

        if(!IsEmpty(_addons.remainingDays))
        {
            if(recurring || allowCancel)
            {
                if([[_addons.state uppercaseString] isEqualToString:@"ONHOLD"])
                {
                    [cell setDaysRemainingColorWithTitleOnHold:@"Renews" daysRemainings:[_addons.remainingDays stringValue]];
                }
                else
                {
                    [cell setRemainingColorWithTitle:@"Renews" daysRemainings:[_addons.remainingDays stringValue]];
                }
            }
            else
            {
                [cell setDaysRemainingColorWithTitle:@"Time left" daysRemainings:[_addons.remainingDays stringValue]];
            }
            [headerView addSubview:cell];
        }
        [_UIViewEntitlement addSubview:headerView];
    }
}

1 个答案:

答案 0 :(得分:1)

试试这个

-(void) getNonMediaCell:(NSString *)package
                                      delegate:(NSObject <nonMediaCellDelegate> *)delegate
{
    .....//other code
    UIView *headerView = [_UIViewEntitlement viewWithTag:12345];
    if(headerView == nil) {
        headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, 20)];
        [headerView setTag:12345];//set tag
    } else {
         NSLog(@"headerView already exist");
    }
    //set values
    .....//other code
}

并在重用方法

- (void)prepareForReuse {
    [super prepareForReuse];
    UIView *header = [_UIViewEntitlement viewWithTag:12345];//use same tag
    [header removeFromSuperview];
}

如果您以编程方式创建和添加多个视图,则将标记设置为每个视图,并通过使用相同的标记值访问它们来删除重用视图。