0

在著名的 UITableCellView 中有一些关于如何将 UIButton 添加到 UITableCellView 的讨论

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

方法以及如何处理按钮点击。我已经对它们进行了测试,它们或多或少都可以正常工作。

我的设置略有不同。我想添加 UIButton - 事实上我有几个按钮位于不同的 UIImageViews - 在我的自定义 UITableCellView 类中使用滑动触摸隐藏/显示。为了简单起见,我们假设只有一个 UIImageView 添加到单元格的视图堆栈中,并且只有一个 UIButton:

这是我的 UITableViewCell 实现的相关部分:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
   self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
   if (self) {
     // sub menu
     self.tableCellSubMenu = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320.0, 88.0)];
     [self.tableCellSubMenu setImage:[UIImage imageNamed:@"cell_menu_back"]];
     [self addSubview:self.tableCellSubMenu];

     UIButton *but = [UIButton buttonWithType:UIButtonTypeCustom];                              
     but.frame = CGRectMake(10.0, 0, 77.0, 88.0);
     [but setImage:[UIImage imageNamed:@"cell_menu_icon_plus_up"] forState:UIControlStateNormal];
     [but setImage:[UIImage imageNamed:@"cell_menu_icon_plus_down"] forState:UIControlStateSelected];
     [but setImage:[UIImage imageNamed:@"cell_menu_icon_plus_down"] forState:UIControlStateHighlighted];
     [but addTarget:self action:@selector(tableCellButtonPress:) forControlEvents:UIControlEventTouchUpInside];
     [self.tableCellSubMenu addSubview:but];
     ...
     }
   return self;
}

UIButton 被添加到 UIImageView,而 UIImageView 又被添加到单元格的视图堆栈中。为简单起见,我将按钮的目标配置为“self”。在我的实际设置中,目标是我处理按钮事件的 UITableViewController。我可以保证所有设置都正常工作(例如,通过将 UIImageView 替换为 UIControl,我们稍后会看到)。

不幸的是,在这种配置中,按钮上的 touch up inside 事件不会触发。唯一被调用的函数是

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

在控制器中。通常,我将 UIButtons 放在 UIControl 视图上。话虽如此,当我在上面的代码中用 UIControl 替换 UIImageView 时,按钮事件按预期触发,但是,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

不再被调用。我两个都想要。

如何让它工作?

更新1:

我在自定义 UITableViewCell 实现中实现了以下方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    CGPoint location = [((UITouch *)[touches anyObject]) locationInView:self];
    if (CGRectContainsPoint(but.frame, location)) {
      [self.touchButtonDelegate tableViewCellButtonTouched:self button:(UIButton*)but indexPath:self.touchButtonIndexPath];
    }
    [super touchesBegan:touches withEvent:event];
}

我仍在使用“UIImageView”对几个按钮进行分组和定位。

self.touchButtonDelegateUITableViewController。此处提供了更完整的解决方案。

4

1 回答 1

0

UIImageViews 没有启用用户交互。您应该将其添加到单元格本身或另一个 UIView。

于 2012-11-21T15:43:13.617 回答