UITableViewCell 中的 UIButton 在 iOS7 中不起作用
Posted
技术标签:
【中文标题】UITableViewCell 中的 UIButton 在 iOS7 中不起作用【英文标题】:UIButton in UITableViewCell Not Working in iOS7 【发布时间】:2013-10-11 12:37:23 【问题描述】:我在 UITableViewCell 中有一个 UIButton,它自 ios4 以来一直正常工作,现在自从 iOS7 更新后它不再工作了。它基本上是一个空盒子的图像。当用户单击图像 (UIButton) 时,图像变为选中框。我没有使用 XIB。有人有什么建议吗?提前致谢。
(我已经尝试过contentView.userInteractionEnabled = NO;
和[cell bringSubviewToFront:button]
但这不起作用)
以下是一些相关代码:
- (UITableViewCell *)taskCell:(NSIndexPath *)indexPath table:(UITableView *)localTableView managed:(NSManagedObject *)managedTask dateFormat:(NSDateFormatter *)localDateFormatter
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [localTableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
// Checkbox
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(-4.0f, -3.0f, 48.0f, 48.0f)];
button.tag=kCellButtonViewTag;
button.adjustsImageWhenHighlighted=NO;
[button setImage:[UIImage imageNamed:@"uncheckedPriorityNone.png"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(toggleCheckedMode:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:button];
[button release];
- (IBAction)toggleCheckedMode:(id)sender
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];
NSIndexPath *indexPath = [self.tableView indexPathForCell:clickedCell];
Task *localTask = [self.fetchedResultsController objectAtIndexPath:indexPath];
UIButton *button = sender;
[button setImage:[UIImage imageNamed:@"checkedGray.png"] forState:UIControlStateNormal];
【问题讨论】:
How to know the UITableview row number 的可能重复项 【参考方案1】:尝试将视图添加到单元格本身,而不是添加到 contentView。
所以
[cell addSubview:button];
代替
[cell.contentView addSubview:button];
【讨论】:
这就是答案!为什么? 这只是解决了糟糕的解决方案。永远不要依赖于遍历私有视图层次结构。【参考方案2】:我遇到了麻烦,IB 似乎不再允许您将视图放置在内容视图之外。我在仍然使用 IB 进行布局的同时处理它的方式是这样的:
-(void)awakeFromNib
[self addSubview:self.myButton];
【讨论】:
【参考方案3】: UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];
这是你的问题。在 iOS7 中,单元格的视图层次结构发生了变化,您已经被它所吸引。我的解决方案here 在 iOS7 中仍然有效,我建议您使用它而不是标签或查看层次结构导航。
【讨论】:
【参考方案4】:我发现了同样的问题。我能想到的最简洁的解决方案是使用 UITableViewCell 中的 editingAccessoryView 属性以及自定义 UIButton。
就我而言,我使用的是 NIB,但这应该没什么区别。所以你的情况是:
// Checkbox
if (([[[UIDevice currentDevice] systemVersion] compare:(@"7.0") options:NSNumericSearch] != NSOrderedAscending))
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(-4.0f, -3.0f, 48.0f, 48.0f);
self.editingAccessoryView = button;
[self.editingAccessoryView setHidden:YES];
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(-4.0f, -3.0f, 48.0f, 48.0f)];
button.tag=kCellButtonViewTag;
button.adjustsImageWhenHighlighted=NO;
[button setImage:[UIImage imageNamed:@"uncheckedPriorityNone.png"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(toggleCheckedMode:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:button];
[button release];
这里的重点是自定义UIButton仍然添加了一个动作,但是在iOS7上,创建了另一个相同大小的按钮,设置为editingAccessoryView并隐藏。这应该是诀窍。
记得在你的 UITableView 中setEditing:YES。
【讨论】:
【参考方案5】:如果你想在你的 UITableView 中设置编辑:YES/NO。您必须使用以下一个,因为在 ios7 上更改了 tableview 的层次结构。
if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1)
[(UITableView *)self.superview isEditing]
else
[(UITableView *)self.superview.superview isEditing]
【讨论】:
以上是关于UITableViewCell 中的 UIButton 在 iOS7 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
更改 UITableViewCell 中的对象也更改了重用 UITableViewCell 的对象
确定 UITableViewCell 中的 UIButton
UITableViewCell 事件中的 UIButton 不起作用