#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!
}