Как обнаружить нажатие на ячейку Uitableview с помощью uiview и uibutton? - PullRequest
0 голосов
/ 15 апреля 2011

Я создал табличное представление и добавляю свой пользовательский интерфейс в представление содержимого ячейки. Uiview имеет Uibutton. Однако я могу добавить uibutton в представление содержимого при создании ячейки.

Я хочу получить событие касания в виде таблицы для выполнения какого-либо действия. Я также хочу, чтобы событие uibutton выполняло другое действие.

Проблема в том, что когда я нажимаю на строку, кнопка также нажимается, и запускаются два события. Как я могу получить оба события незаметно? то есть нажмите на ячейку таблицы, когда щелкнет часть ячейки за пределами границы uibuttons.

Ответы [ 3 ]

2 голосов
/ 15 апреля 2011

Вы можете добавить кнопку в ячейку как

- (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 голос
/ 15 апреля 2011

Вы уверены, что два разных события запускаются одним и тем же касанием?Насколько я понимаю, UIKit генерирует только один UIEvent и отправляет его в самое верхнее представление в иерархии, которое отвечает на этот тип жеста.В этом случае, если кнопка находится выше в иерархии представления, как это возможно, она должна получать сообщение о событии.Но, возможно, я ошибаюсь.

Одним из решений, позволяющих определенно избежать возможности запуска двух событий, хотя, возможно, и не идеальным, было бы отключить выбор строки для tableView следующим образом:

        self.tableView.allowsSelection = NO;

Затем добавьте представление, покрывающее остаток таблицы Cell, и добавьте распознаватель жестов в это представление.Поскольку они не охватывают одну и ту же область, вероятность возникновения конфликтных событий отсутствует.Конечно, чтобы узнать, какая строка была нажата, вам нужно добавить переменную экземпляра для кнопки и нового представления для хранения indexPath.Вы должны установить путь индекса при настройке tableCell в tableView: cellForRowAtIndexPath:

Надеюсь, что это полезно или дает вам новые идеи.

0 голосов
/ 28 апреля 2015

Вы можете создать подкласс 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!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...