0

我正在UITableViewCell使用几个子视图自定义 a:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
  self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
  if (self) {
    _mainView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 40.0f)];

    _hiddenOptionsView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 40.0f)];

    _menuView = [[CellMenuView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 20.0f)];

    [self addSubview:_menuView];
    [self addSubview:_hiddenOptionsView];
    [self addSubview:_mainView];
  }
  return self;
}

该类CellMenuView是一个UIView子类,它有两个UIButtons在初始化时设置对应的目标操作:

- (id)initWithFrame:(CGRect)frame {   
  self = [super initWithFrame:frame];
  if (self) {
    UIImageView *background = [[UIImageView alloc] initWithFrame:frame];
    [background setImage:[UIImage imageNamed:@"cell_menu_bg.png"]];
    [self addSubview:background];

    CGFloat buttonX = frame.origin.x;
    CGFloat buttonY = frame.origin.y + 3.0f;
    CGFloat buttonWidth = frame.size.width / 2.0f;
    CGFloat buttonHeight = 10.0f;

    _editButton = [UIButton buttonWithType:UIButtonTypeCustom];
    _editButton.frame = CGRectMake(buttonX, buttonY, buttonWidth, buttonHeight);
    _editButton.backgroundColor = [UIColor clearColor];
    _editButton.titleLabel.shadowColor = [UIColor blackColor];
    _editButton.titleLabel.shadowOffset = CGSizeMake(0.0f, -1.5f);
    _editButton.titleLabel.font = [UIFont boldSystemFontOfSize:22.0f];
    [_editButton setTitle:@"Edit" forState:UIControlStateNormal];
    [_editButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [_editButton addTarget:self action:@selector(editButton:) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:_editButton];

    _fireButton = [UIButton buttonWithType:UIButtonTypeCustom];
    _fireButton.frame = CGRectMake(buttonWidth, buttonY, buttonWidth, buttonHeight);
    _fireButton.backgroundColor = [UIColor clearColor];
    _fireButton.titleLabel.shadowColor = [UIColor blackColor];
    _fireButton.titleLabel.shadowOffset = CGSizeMake(0.0f, -1.5f);
    _fireButton.titleLabel.font = [UIFont boldSystemFontOfSize:22.0f];
    [_fireButton setTitle:@"Fire" forState:UIControlStateNormal];
    [_fireButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [_fireButton addTarget:self action:@selector(fireButton:) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:_fireButton];

    return self;
  }
}

我已经实现了目标操作方法,但它们没有被执行。相反,didSelectRowAtIndexPath:每次我按下其中一个按钮时,它都会优先于按钮内的修饰事件。

我能够在按钮上触发事件的唯一方法是确保UIButton's标题中的一个字母被触摸(当然使用模拟器)。

我必须说它_menuView隐藏在其他子视图后面,并在按下单元格中的自定义附件按钮时显示在单元格下方。它通过修改 Y 原点出现,并通过0.0f再次设置它消失。

我认为这可能与视图层次结构有关,因为我过去通过直接向单元格添加按钮没有任何问题。但我只是在这里猜测。

如何使按钮上的事件优先于didSelectRowAtIndexPath:方法?

谢谢!

4

1 回答 1

0

实施

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

并为您不想选择的 indexPath 返回 nil;这将防止didSelectRowAtIndexPath在该单元格上被调用,并且(希望)将调用您的自定义操作。

更新:在我自己实现之后(为按钮添加边框),这就是我所拥有的。在此处输入图像描述

实现此目的的代码(与您的不同)如下:

单元菜单视图.m

    self.backgroundColor = [UIColor blackColor];
    _editButton.layer.borderColor = [UIColor whiteColor].CGColor;
    _editButton.layer.borderWidth = 2;
    _fireButton.layer.borderColor = [UIColor whiteColor].CGColor;
    _fireButton.layer.borderWidth = 2;

UITableViewCell 子类

    // Change in height to make it taller
    _menuView = [[TestBtn alloc] initWithFrame:CGRectMake(0.0f, 20.0f, 320.0f, 60.0f)];

UITableViewController 子类

    self.tableView.rowHeight = 100;

经过测试,我的工作正常。如果我在白色方块内单击,按钮操作将正常执行,并且didSelectRowAtIndexPath不会被调用。didSelectRowAtIndexPath仅在我单击按钮外部时调用。

我认为这里的问题可能是您的按钮高度/框架,以及您的行高。为您的按钮添加边框,以检查其可点击区域,并增加按钮的高度以增加可点击区域。

于 2012-11-02T09:42:43.500 回答