在iOS7中,UITableViewCell中的UIButton无法工作

4
我有一个位于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];
}

1
可能是重复的问题:如何知道UITableview行号 - jrturton
5个回答

5
尝试将视图添加到单元格本身,而不是contentView中。
因此,
[cell addSubview:button];

取代

[cell.contentView addSubview:button];

那就是答案!为什么? - Ben Robinson
这只是修复了不好的解决方案。永远不要依赖于遍历私有视图层次结构。 - jrturton

3

我遇到了这个问题,IB似乎不再让你将视图放在contentview之外。但我仍然使用IB进行布局等操作的方法是这样的:

-(void)awakeFromNib{
    [self addSubview:self.myButton];
}

2
 UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];

这是你的问题。在iOS7中,单元格的视图层次结构发生了变化,你依赖于此而被困扰。我的解决方案在这里仍然适用于iOS7,我建议你使用它来代替标记或视图层次导航。


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

0
如果你想在UITableView中设置setEditing:YES/NO,你必须使用下面的代码,因为在iOS7上表格视图的层次结构已经改变。
if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1)

{          
  [(UITableView *)self.superview isEditing]    
}
    else    

{    
        [(UITableView *)self.superview.superview isEditing]    
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接