UITableViewController выбрать заголовок для раздела - PullRequest
32 голосов
/ 13 октября 2011

У меня есть UITableView с несколькими разделами.Каждый раздел имеет заголовок раздела (пользовательский вид). Есть ли простой способ определить, когда кто-то выбирает заголовок раздела?(Точно так же как didSelectRowAtIndexPath, но для заголовка?)

Ответы [ 4 ]

68 голосов
/ 22 июля 2012

Это не радикально отличается от ответа @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;

Вы можете использовать gest.view, чтобы увидеть, какие из них были затронуты. Затем сделайте все, что вам нужно, чтобы выяснить, какой это был заголовок (теги, поиск в массиве данных ...)

27 голосов
/ 13 октября 2011

Нет, это невозможно сделать с помощью UITableViewDelegate.

. Что вы можете сделать, это добавить кнопку размера представления заголовка раздела и добавить его в представление.Установите тег кнопки на индекс раздела.Затем просто добавьте UIViewController в качестве цели для UIControlEventTouchUpInside.

Затем, посмотрев на тег кнопки, вы увидите, в каком разделе нажата кнопка.

4 голосов
/ 24 мая 2016

Вот что у меня сработало в Swift 2:

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let footerView = UITableViewHeaderFooterView()
    footerView.textLabel?.text = "Header Text"
    let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap))
    tapRecognizer.delegate = self
    tapRecognizer.numberOfTapsRequired = 1
    tapRecognizer.numberOfTouchesRequired = 1
    footerView.addGestureRecognizer(tapRecognizer)
    return footerView
}

func handleTap(gestureRecognizer: UIGestureRecognizer) {
    print("Tapped")
}
0 голосов
/ 10 апреля 2018

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

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