选定的 UIButton 在选定的 UITableViewCell 内消失
Posted
技术标签:
【中文标题】选定的 UIButton 在选定的 UITableViewCell 内消失【英文标题】:Selected UIButton disappears inside selected UITableViewCell 【发布时间】:2010-04-13 22:18:30 【问题描述】:我有一个表,我有它的 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;
【问题讨论】:
我们可以看看你的cellForRowAtIndexPath
方法的内容吗? tableView:didSelectRowAtIndexPath:
也会很有帮助,如果你已经实现了。
是的,我在编辑中包含了它,我没有实现 didSelectRowAtIndexPath,只有 cellForRowAtIndexPath
当您说按钮“消失”时,它是隐藏起来了,还是实际上不复存在?如果你按下它应该在的区域,按钮的点击处理程序会被调用吗?
它变成“隐藏”,如果我再点击几次,按钮会再次出现,甚至颜色从蓝色(选中)变为正常。
我也有 willSelectRowAtIndexPath:(NSIndexPath *)indexPath 方法,只是改变了一些与表格无关的变量,最后返回 indexPath。
【参考方案1】:
我在 OS 4.0 beta 上注意到了一个类似的问题,我在 UITableViewCell 中有一个 UIButton,其中 setImage:forState:UIControlStateNormal。当我在选择一行并按下另一个表视图后返回表视图时,该按钮将消失。为了克服这个问题,我也在图像上设置了图像:forState:UIControlStateHighlighted。我不确定这是否会解决您的特定问题,但它确实对我有用。我认为在 didSelectRowAtIndexPath: 中设置 button.highlighted=NO 也可以,但我没有尝试。
【讨论】:
我在 ios 4.3 中仍然看到这个问题。这种解决方法似乎仍然有效。【参考方案2】:按钮似乎以某种方式继承了选定状态作为其突出显示状态。有人找到解决方案吗?
解决方案:我对这个 hack 不太满意,但它适用于我的目的。基本上,我希望该按钮仅在选择单元格时出现。子类化 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];
【讨论】:
【参考方案3】:嘿,我知道这是一篇旧帖子,但这可能会有所帮助: UITableView 将尝试在其子视图的整个层次结构中传播其选择状态。如果一个子视图响应-setHighlighted: 会根据单元格选择状态进行更新。
这解释了为什么按钮变成蓝色(突出显示),也解释了为什么按钮图像有时会消失:一个 UIButton 包含 UIImageView 实例来显示其图像,并将根据其状态交换每个图像视图的图像(-[UIControl 状态])。但是表格视图单元格出现并将按钮的图像视图的突出显示标志设置为 YES(按钮没有预见到),但是此图像视图没有突出显示状态的图像,因此即使按钮不断交换,您也什么也看不到图像根据其状态。
我使用的解决方案是,只要选择或突出显示单元格,我将按钮图像视图的突出显示的标志设置为NO。
【讨论】:
【参考方案4】:我也遇到了这个问题(对于 4.3 和更低版本),上面的解决方案对我不起作用。最后,设置 button.adjustsImageWhenHighlighted = NO;创建按钮时对我有用。
【讨论】:
【参考方案5】:诀窍是将 UIButton 作为子视图添加到 UIImageView 上。
创建 UIImage
UIImage backgroundImg = [UIImage imageName:@"yourimg"];
UIImageView imageView = [UIImageView alloc]initWithImage:backgrounding];
现在创建按钮
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;
最后将按钮添加到 UIImageView 上
[imageView addSubview:button];
[cell addSubview imageView];
现在您不必使用高亮颜色了。
【讨论】:
以上是关于选定的 UIButton 在选定的 UITableViewCell 内消失的主要内容,如果未能解决你的问题,请参考以下文章