简体   繁体   中英

UIButton subview in UITableViewCell doesn't hide as expected

My recent frustration is a UIButton subview in each UITableViewCell of my UITableView which I want to setHidden: according to a specific clause for each indexPath . My code is pretty much the following:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
...

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        [self initCell:cell forIndexPath:indexPath];
    }
    [self updateCell:cell forIndexPath:indexPath];
    return cell;
}

and the init and update methods are the following:

- (void)initCell:(UITableViewCell *)cell forIndexPath:(NSIndexPath *)indexPath
{
    ...

    UIButton *btnMy = [UIButton buttonWithType:UIButtonTypeCustom];
    btnMy.tag = kButtonMyTag;
    [btnMy setFrame:CGRectMake(170, 45, 100, 30)];
    [btnMy setBackgroundImage:[UIImage imageNamed:@"btn_image"] forState:UIControlStateNormal];
    btnMy.adjustsImageWhenHighlighted = YES;
    [btnMy setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    btnMy.titleLabel.font = [UIFont fontWithName:@"MyFont" size:14];
    [btnMy addTarget:self action:@selector(btnMyPressed:) forControlEvents:UIControlEventTouchUpInside];
    [cell addSubview:btnMy];

    UIImageView *imgViewAccessory = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"table_accessory"]];
    cell.accessoryView = imgViewAccessory;
    [imgViewAccessory release];
}

- (void)updateCell:(UITableViewCell *)cell forIndexPath:(NSIndexPath *)indexPath
{
    UIButton *btnMy = (UIButton *)[cell viewWithTag:kButtonMyTag];

    MyObject *object = (MyObject *)[self.dataSource objectAtIndex:indexPath.row];

    if(object.meetsCondition) 
    {
        btnMy.hidden = NO;
    }
    else 
    {
        btnMy.hidden = YES;
    }
    ...
}

The frustrating result is that when scrolling the button shows and hides randomly and not as expected according the if clause in the updateCell method. Any help would be much appreciated. Thanks in advance!

You should make custom cell and depending upon the condition show and hide the button

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSArray *nib;
    static NSString *cellIdentifier= @"cell";

    UITableViewCell *theCell = [self.tblView dequeueReusableCellWithIdentifier:cellIdentifier];

    if([theCell.contentView subviews]){
        for(UIView *view in [theCell.contentView subviews]){
            [view removeFromSuperview];
        }
    }

    if(theCell== nil)
    {
        nib  = [[NSBundle mainBundle] loadNibNamed:@"Your custom cell name" owner:self options:nil]; 
        theCell = [nib objectAtIndex:0];
        theCell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    UIButton *btn=(UIButton*)[theCell.contentView viewWithTag:101];
if(yourcondition)
//hide button
else
//show button
}

This will do

Use this code in your CellForRowAtIndexPath Also.

 MyObject *object = (MyObject *)[self.dataSource objectAtIndex:indexPath.row];

    if(object.meetsCondition) {
        btnMy.hidden = NO;
    }
    else {
        btnMy.hidden = YES;
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM