У меня есть UITableView
с несколькими разделами. Каждый раздел имеет заголовок раздела (пользовательский вид). Есть ли простой способ определить, когда кто-то выбирает заголовок раздела? (Точно так же, как didSelectRowAtIndexPath
, но для заголовка?)
UITableViewController выбрать заголовок для раздела
Ответ 1
Нет никакого способа сделать это с помощью UITableViewDelegate
.
Что вы можете сделать, так это добавить кнопку размера заголовка заголовка раздела и добавить его в представление. Установите тег кнопки в индекс раздела.
Затем просто добавьте UIViewController
в качестве цели для UIControlEventTouchUpInside
.
Затем, взглянув на тег кнопки, вы можете увидеть, какой раздел щелкнуть.
Ответ 2
Это не радикально отличается от ответа @rckoenes, но он обеспечивает более ортодоксальный способ обработки событий на представлениях, а не с помощью невидимых кнопок.
Я предпочел бы добавить UITapGestureRecognizer в свой заголовок вместо добавления невидимых кнопок и изменения их размера:
UITapGestureRecognizer *singleTapRecogniser = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)] autorelease];
[singleTapRecogniser setDelegate:self];
singleTapRecogniser.numberOfTouchesRequired = 1;
singleTapRecogniser.numberOfTapsRequired = 1;
[yourHeaderView addGestureRecognizer:singleTapRecogniser];
а затем:
- (void) handleGesture:(UIGestureRecognizer *)gestureRecognizer;
Вы можете использовать gesture.view, чтобы увидеть, что было затронуто. Затем сделайте все, что вам нужно, чтобы узнать, какой заголовок он (теги, поиск массива данных...)
Ответ 3
Вот что сработало для меня в Swift 2:
override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let v = UITableViewHeaderFooterView()
v.textLabel?.text = "Header Text"
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap))
tapRecognizer.delegate = self
tapRecognizer.numberOfTapsRequired = 1
tapRecognizer.numberOfTouchesRequired = 1
v.addGestureRecognizer(tapRecognizer)
return v
}
func handleTap(gestureRecognizer: UIGestureRecognizer) {
print("Tapped")
}
Ответ 4
Это сработало для оценки раздела и строки. Я надеюсь, что это помогает всем, кто изо всех сил пытается получить эту работу должным образом...
override func viewDidLoad() {
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(sectionTapped(sender:)))
tableView?.addGestureRecognizer(tapGesture)
tapGesture.delegate = self as? UIGestureRecognizerDelegate
}
@objc func sectionTapped(sender: UITapGestureRecognizer) {
if sender.state == UIGestureRecognizerState.ended {
guard let tableView = self.tableView else {
return
}
if let view = sender.view {
let tapLocation = sender.location(in: tableView)
if let tapIndexPath = tableView.indexPathForRow(at: tapLocation) {
if (tableView?.cellForRow(at: tapIndexPath) as? UITableViewCell) != nil {
// do something with the row
print("tapped on row at index: \(tapIndexPath.row)")
}
} else {
for i in 0..<tableView.numberOfSections {
let sectionHeaderArea = tableView.rectForHeader(inSection: i)
if sectionHeaderArea.contains(tapLocation) {
// do something with the section
print("tapped on section at index: \(i)")
}
}
}
}
}
}