Как сделать UITableView Header доступным?

Я создал собственный раздел-заголовок для UITableView, который включает в себя некоторые элементы управления, такие как сегментированный элемент управления, UIImageView и т.д. Он успешно появляется, но не может быть недоступен, поэтому я не могу взаимодействовать с его элементами управления.

Мне нужно знать, как я могу сделать это представление заголовка доступным?

Ответы

Ответ 1

Нет способа сделать это с помощью UITableViewDelegate.

Вы должны добавить UITapGestureRecognizer в yourHeaderView.

UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureHandler:)];
[singleTapRecognizer setDelegate:self];
singleTapRecognizer.numberOfTouchesRequired = 1;
singleTapRecognizer.numberOfTapsRequired = 1;   
[yourHeaderView addGestureRecognizer:singleTapRecognizer];


-(void) handleGesture:(UIGestureRecognizer *)gestureRecognizer; //do in this method whatever you want

ДЛЯ Swift 3.0

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(YOURVIEWCONTROLLER.TapGestureRecognizer(_:)))
yourHeaderView.addGestureRecognizer(tapGesture)

func TapGestureRecognizer(gestureRecognizer: UIGestureRecognizer) {
    //do your stuff here 
}

Свифт> = 4.0

Добавить ссылку на класс UIGestureRecognizerDelegate, унаследованную

let tap = UITapGestureRecognizer(target: self, action:#selector(self.handleTap(_:)))
tap.delegate = self
self.view.addGestureRecognizer(tap)

  @objc func handleTap(_ sender: UITapGestureRecognizer) {
        //Do your work 
    }

может быть, это поможет.

Удачного кодирования.

Ответ 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")
}

Ответ 3

Простое решение для Swift 3.0

 func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

        let v = UITableViewHeaderFooterView()
        let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap))
        v.addGestureRecognizer(tapRecognizer)
        return v
    }


    func handleTap(gestureRecognizer: UIGestureRecognizer)
    {
        controller?.view.endEditing(true)
    }

Ответ 4

Создайте пользовательский раздел headerView.., а затем добавьте к нему жест нажатия.

UITapGestureRecognizer * recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];

//This method will be called on Tap of section header
- (void)handleTap:(UITapGestureRecognizer *)sender {
//Do the action on Tap
}

Ответ 5

Создать пользовательский вид, используемый в качестве заголовка главы раздела, и реализовать метод - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event, он будет вызываться, когда ваш палец коснется его.

Ответ 6

Вы можете просто добавить UIButton в свой заголовок (или ваш заголовок может быть сам UIButton).

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{

        static NSString *cellIdentifier = @"cellIdentifier";

    UITableViewCell *cell = (UITableViewCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    UIButton *cellButton = (UIButton*)[cell viewWithTag:1];
    [cellButton addTarget:self action:@selector(premiumSectionClicked:) forControlEvents:UIControlEventTouchUpInside];

    return cell;
}

-(void)buttonTapped:(id)sender{

}

Ответ 7

Моя реализация в Swift:

В UITableViewController:

let myView = MyView()

let tapRecognizer = UITapGestureRecognizer(target: myView, action: "handleTap")
myView.addGestureRecognizer(tapRecognizer)

self.tableView.tableHeaderView = myView

В MyView:

class MyView: UIView {

    func handleTap() {
        // Handle touch event here
    }
}

Ответ 8

быстрое решение для этого:

let tapR : UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "gotoHeaderArticle")
tapR.delegate = self
tapR.numberOfTapsRequired = 1
tapR.numberOfTouchesRequired = 1
yourView.addGestureRecognizer(tapR)

Затем реализуем

func gotoHeaderArticle() {

}

Удостоверьтесь, что ваш вызывающий viewcontroller придерживается UIGestureRecognizerDelegate

Ответ 9

Обновление для Swift 3.1

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(TapGestureRecognizer(gestureRecognizer:)))
yourView.addGestureRecognizer(tapGesture)

func TapGestureRecognizer(gestureRecognizer: UIGestureRecognizer) {
        //do your stuff here
        print("Gesture")
    }

Ответ 10

Вот что сработало для меня

  -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
        static NSString *cellIdentifier = @"cellIdentifier";
    YourHeaderTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
   cell.imageView.image = [image imageNamed:@"imageName"];
cell.segmentedControl.tag = section;
[cell.segmentedControl addTarget:self
                     action:@selector(action:)
           forControlEvents:UIControlEventValueChanged];
    return cell;
}

- (void)action:(id)sender{
    UISegmentedControl *segmentedControl = (UISegmentedControl *) sender;
    NSLog(@"selected section:%ld",(long)segmentedControl.tag);

}

Ответ 11

Если кому-то нужно решение, которое может работать, когда у таблицы есть несколько разделов, у меня возникла та же проблема, и решение, которое я viewForHeaderInSection, заключалось в создании различных целей для кнопки в методе viewForHeaderInSection на основе раздела. Я использую кнопку, но это должно работать так же хорошо с UITapGestureRecognizer

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {

        // ...

        if section == 0 {
            cell.button.addTarget(self, action: #selector(firstSectionTapped(_:)), for: .touchUpInside)
        } else if section == 1 {
            cell.button.addTarget(self, action: #selector(secondSectionTapped(_:)), for: .touchUpInside)
        }

        // ...

}

Затем в ViewController:

@objc func goalCategoryTapped(_ sender: UITapGestureRecognizer?) {
    print("Section One Tapped")
}

@objc func ideaCategoryTapped(_ sender: UITapGestureRecognizer?) {
    print("Section Two Tapped")
}

Ответ 12

Если вам нужно знать индекс раздела, к которому вы подключились, вы можете использовать следующий шаблон (Swift 4):

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let view = UIView(frame: CGRect(x: 0, y: 0, width: 300, height: 44))

    // Configure your view here
    // ...

    let tapGestureRecognizer = UITapGestureRecognizer(
        target: self,
        action: #selector(headerTapped(_:))
    )
    view.tag = section
    view.addGestureRecognizer(tapGestureRecognizer)
    return view
}

@objc func headerTapped(_ sender: UITapGestureRecognizer?) {
    guard let section = sender?.view?.tag else { return }

    // Use your section index here
    // ...
}