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];
}
4

5 回答 5

5

尝试将视图添加到单元格本身,而不是 contentView。

所以

[cell addSubview:button];

代替

[cell.contentView addSubview:button];
于 2014-01-15T19:35:23.403 回答
3

我遇到了麻烦,IB 似乎不再允许您将视图放置在内容视图之外。我在仍然使用 IB 进行布局的同时处理它的方式是这样的:

-(void)awakeFromNib{
    [self addSubview:self.myButton];
}
于 2014-04-03T18:46:03.190 回答
2
 UITableViewCell *clickedCell = (UITableViewCell *)[[sender superview] superview];

这是你的问题。在 iOS7 中,单元格的视图层次结构发生了变化,您已经被它所吸引。我的解决方案在iOS7中仍然有效,我建议您使用它而不是标签或视图层次导航。

于 2013-12-05T11:38:59.823 回答
0

我发现了同样的问题。我能想出的最简洁的解决方案是使用 UITableViewCell 中的editingAccessoryView属性以及自定义 UIButton 来支持 iOS7 和 iOS7 之前的版本。

在我的情况下,我使用的是 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 中设置编辑:YES 。

于 2013-10-18T15:12:58.210 回答
0

如果你想在你的 UITableView 中设置编辑:YES/NO。您必须使用以下一个,因为在 ios7 上更改了 tableview 的层次结构。

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1)

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

{    
        [(UITableView *)self.superview.superview isEditing]    
}
于 2013-12-05T11:34:33.860 回答