我在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];
}
答案 0 :(得分:5)
尝试将视图添加到单元格本身,而不是添加到contentView。
所以
[cell addSubview:button];
而不是
[cell.contentView addSubview:button];
答案 1 :(得分:3)
我遇到了麻烦,IB似乎不再允许你在contentview之外放置视图了。我处理它的方式仍然使用IB进行布局而不是这样:
-(void)awakeFromNib{
[self addSubview:self.myButton];
}
答案 2 :(得分:2)
UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];
这是你的问题。在iOS7中,单元格的视图层次结构已经发生了变化,并且您已经因此而陷入困境。我的解决方案here仍可在iOS7中使用,我建议您使用它而不是标记或查看层次结构导航。
答案 3 :(得分:0)
我发现了同样的问题。我能想到的最干净的解决方案是为iOS7和iOS7之前提供了支持,它使用了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 。
答案 4 :(得分:0)
如果你想在你的UITableView中使用setEditing:YES / NO。您必须使用下面的一个,因为在ios7上更改了tableview的层次结构。
if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1)
{
[(UITableView *)self.superview isEditing]
}
else
{
[(UITableView *)self.superview.superview isEditing]
}