选定的UIButton在选定的UITableViewCell中消失

时间:2010-04-13 22:18:30

标签: iphone uitableview uibutton

我有一个表,我有cellForRowAtIndexPath委托给它,我在该方法中创建了UITableViewCell的实例,我将返回。在cellForRowAtIndexPath的某处,我还将UIButton添加到该单元格的cell.contentView。一切正常,直到我选择带有按钮的单元格。单元格将颜色更改为蓝色(可以),uibutton也将颜色更改为蓝色。现在,如果我点击所选单元格内的UIButton,它就会消失!哇,这很奇怪,我该如何解决?当我点击它时,我希望选定单元格内的UIButton保持不变。

编辑:包含我的cellForRowAtIndexPath实现

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
static NSString *sectionsTableIdentifier = @" sectionsTableIdentifier ";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: sectionsTableIdentifier];


    for (UIView *view in cell.contentView.subviews)
      [view removeFromSuperview];


     if (cell == nil) {
      cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero 
                reuseIdentifier: sectionsTableIdentifier] autorelease];

     }

     CGRect newIconRect = CGRectMake(276, 40, 29, 29);
      UIButton *newIcon = [[UIButton alloc] initWithFrame:newIconRect];
      [newIcon setImage:[UIImage imageNamed:@"mynewicon.png"] forState:UIControlStateNormal];
      [cell.contentView addSubview:newIcon];
      [newIcon release];


    return cell;

    }

5 个答案:

答案 0 :(得分:6)

我在OS 4.0 beta上发现了类似的问题,我在UITableViewCell中使用了setImage:forState:UIControlStateNormal。在选择一行并推送另一个表视图后,当我返回到表视图时,该按钮将消失。为了解决这个问题,我在图像上也设置了setImage:forState:UIControlStateHighlighted。我不确定这是否可以解决您的特定问题,但它确实适用于我。我认为在didSelectRowAtIndexPath中设置button.highlighted = NO也可能有效,但我没试过。

答案 1 :(得分:2)

按钮似乎以某种方式继承了所选状态作为其突出显示的状态。有人找到了解决方案吗?

解决方案:我对这个黑客并不是很满意,但它适用于我的目的。基本上,我希望按钮仅在选择单元格时出现。对UITableViewCell进行子类化并添加这些覆盖(editButton是在init中添加到单元格的contentView中的按钮实例)。

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    editButton.hidden = YES;

    [super setSelected: selected
              animated: animated];

    editButton.highlighted = NO;

    if (selected)
        [editButton performSelector: @selector(setHidden:)
                         withObject: nil
                         afterDelay: 0.2];
}

- (void)setSelected:(BOOL)selected {
    editButton.hidden = YES;

    [super setSelected: selected];

    editButton.highlighted = NO;

    if (selected)
        [editButton performSelector: @selector(setHidden:)
                         withObject: nil
                         afterDelay: 0.2];
}

答案 2 :(得分:2)

嘿,我知道这是一个老帖子,但这可能会有所帮助: UITableView将尝试在其子视图的整个层次结构中传播其选择状态。如果一个子视图响应-setHighlighted:它将根据单元格选择状态进行更新。

这解释了为什么按钮变为蓝色(突出显示),以及有时按钮图像消失的原因:UIButton包含UIImageView实例以显示其图像,并将根据其状态交换每个图像视图的图像( - [UIControl状态])。但是表格视图单元格将按钮图像视图的突出显示标志设置为YES(按钮未预见到),但此图像视图没有突出显示状态的图像,因此即使按钮保持交换,您也看不到任何内容图像根据其状态。

我使用的解决方案是,无论何时选择或突出显示单元格,我都会将按钮图像视图的突出显示标志设置为NO。

答案 3 :(得分:2)

我也遇到了麻烦(4.3以下),上面的解决方案对我不起作用。最后,设置button.adjustsImageWhenHighlighted = NO;当创建按钮时,对我来说就是一招。

答案 4 :(得分:0)

诀窍是将UIButton作为子视图添加到UIImageView上。

  1. 创建UIImage

    UIImage backgroundImg = [UIImage imageName:@"yourimg"];
    UIImageView imageView = [UIImageView alloc]initWithImage:backgrounding];
    
  2. 现在创建按钮

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    // set the frame. the position of the button is the center 
    CGRect newIconRect = CGRectMake(imageView.center.x, imageView.center.y, 29, 29);
    
    button.frame = newIconRect;
    
  3. 最后将按钮添加到UIImageView

    [imageView addSubview:button];
    [cell addSubview imageView];
    
  4. 现在你不必玩高亮颜色。