如何使用uiview和uibutton检测Uitableview单元格?

时间:2011-04-15 09:17:06

标签: iphone objective-c uitableview

我创建了一个表格视图,我将自定义uiview添加到单元格的内容视图中。 uiview有一个uibutton。但是,我可以在创建单元格时将uibutton添加到内容视图中。

我想在tableview上获取tap事件以执行某些操作。我还想在uibutton上点击事件来执行不同的操作。

问题是当我点击一行时按钮也被按下并触发两个事件。 我怎样才能谨慎地得到这两件事?当点击uibuttons边界外的单元格的部分时,点击tableview单元格。

3 个答案:

答案 0 :(得分:2)

您可以在单元格中添加按钮

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

UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake( 13.0f, 13.0f, 90.0f, 90.0f)];
[button addTarget:self action:@selector(BtnPressed) forControlEvents:UIControlEventTouchUpInside];
[cellView.contentView addSubview:button];

然后你可以单独获取事件

答案 1 :(得分:1)

您确定同一个水龙头会触发两个不同的事件吗?我的理解是UIKit只生成一个UIEvent并将其发送到层次结构中最顶层的视图,以响应该类型的手势。在这种情况下,如果视图层次结构中的按钮位于较高位置,则可能是接收事件消息。但是,我可能错了。

一个绝对避免触发两个事件但可能不是理想事件的可能性的解决方案是停用tableView的行选择,如下所示:

        self.tableView.allowsSelection = NO;

然后,添加一个覆盖tableCell&的剩余部分的视图。为该视图添加手势识别器。由于它们不覆盖同一区域,因此不存在冲突事件的可能性。当然,要知道触发了哪一行,您必须为按钮和新视图添加一个实例变量来保存indexPath。在tableView中设置tableCell时设置索引路径:cellForRowAtIndexPath:

希望这有用,或者给你一些新的想法。

答案 2 :(得分:0)

你可以继承UITableViewCell并添加一个按钮,这是一个示例类:

import UIKit

private let DWWatchlistAddSymbolCellAddSymbolButtonLeftMargin: CGFloat = 15

class DWWatchlistAddSymbolCell: UITableViewCell {

  private(set) var addSymbolButton:UIButton

  init(reuseIdentifier:String?, primaryTextColor:UIColor) {
    self.addSymbolButton = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton
    super.init(style:UITableViewCellStyle.Default, reuseIdentifier:reuseIdentifier)
    selectionStyle = UITableViewCellSelectionStyle.None
    backgroundColor = UIColor.clearColor()
    imageView!.image = UIImage(named:"PlusIcon")!
    addSymbolButton.setTitle("Add Symbol", forState:UIControlState.Normal)
    addSymbolButton.setTitleColor(primaryTextColor, forState:UIControlState.Normal)
    addSymbolButton.contentHorizontalAlignment = UIControlContentHorizontalAlignment.Left
    addSymbolButton.contentVerticalAlignment = UIControlContentVerticalAlignment.Center
    contentView.addSubview(addSymbolButton)
  }

  required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  // MARK: Layout

  override func layoutSubviews() {
    super.layoutSubviews()
    addSymbolButton.frame = contentView.frame
    let imageViewFrame = imageView!.frame
    let imageViewMaxX = imageViewFrame.origin.x + imageViewFrame.size.width
    let addSymbolButtonX = imageViewMaxX + DWWatchlistAddSymbolCellAddSymbolButtonLeftMargin
    addSymbolButton.contentEdgeInsets = UIEdgeInsetsMake(0, addSymbolButtonX, 0, 0);
  }
}

您可以在底部看到“添加符号”按钮:

Add Symbol Button Cell

当您返回UITableViewDataSource的单元格时,请务必设置按钮的目标位置:

private func addButtonCell(tableView: UITableView) -> UITableViewCell {
  var cell:DWWatchlistAddSymbolCell? = tableView.dequeueReusableCellWithIdentifier(kDWWatchlistViewControllerAddButtonCellReuseIdentifier) as? DWWatchlistAddSymbolCell
  if (cell == nil) {
    cell = DWWatchlistAddSymbolCell(reuseIdentifier:kDWWatchlistViewControllerAddButtonCellReuseIdentifier, primaryTextColor:primaryTextColor)
  }
  cell!.addSymbolButton.addTarget(self,
    action:Selector("didPressAddSymbolButton"),
    forControlEvents:UIControlEvents.TouchUpInside)
  return cell!
}