Как определить нажатие на ячейку Uitableview с помощью uiview и uibutton?

#iphone #objective-c #uitableview

#iPhone #objective-c #uitableview

Вопрос:

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

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

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

Комментарии:

1. ваша кнопка полностью перекрывает область вашей ячейки или нет?

2. Нет, это не перекрывает область ячейки. Это всего лишь часть ячейки в правом нижнем углу.

Ответ №1:

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

 - (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. да, когда вы нажимаете на ячейку, все вложенные представления показывают свое выделенное состояние, но это не вызывает событие вашей кнопки.

2. если вы используете пользовательскую кнопку, вам нужно установить для UIControlStateHighlighted то же изображение или тот же цвет, что и для UIControlStateNormal. Это удалит эффект подсветки.

3. Эй, но эффект будет таким же при нажатии соответствующей кнопки. Как я могу показать нажатое состояние для этой кнопки?

4. нажатое состояние — это выделенное состояние

Ответ №2:

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

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

         self.tableView.allowsSelection = NO;
  

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

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

Комментарии:

1. решение saadnib намного более прямое. Я бы согласился с этим.

Ответ №3:

Вы могли бы создать подкласс 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);
  }
}
  

Вы можете увидеть кнопку «Добавить символ» внизу:

                                       Добавить ячейку кнопки символа

Когда вы возвращаете ячейку для 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!
}