2013-11-15 7 views
14

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

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

+2

Post код ... – Ilario

+2

если вы используете ImageView в качестве базового представления, а затем используете imageView.userInteractionEnabled = YES; – Savitha

+0

напишите свой код. – manujmv

ответ

1

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

4

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

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 
} 
18

Там нет никакого способа сделать это с UITableViewDelegate.

Вы должны добавить UITapGestureRecognizer к yourHeaderView Like:

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 
} 

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

Счастливое кодирование.

+0

, если на экране было больше 1 секции (доза не требуется прокручивать), нажмите на все разделы, действуя одинаково. – Vahid

+2

Простое примечание: '.numberOfTouchesRequired' и' .numberOfTapsRequired' по умолчанию установлены в 1, поэтому вам не нужно вручную устанавливать их, если это не что-то иное, чем 1. – QuantumHoneybees

1

Моя реализация в 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 
    } 
} 
2

Вы можете просто добавить 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{ 

} 
+0

Самое простое решение :) – JOM

1

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

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

Затем осуществить

func gotoHeaderArticle() { 

} 

Убедитесь, чтобы сделать свое призвание ViewController придерживаться UIGestureRecognizerDelegate

3

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

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") 
} 
+2

будьте осторожны, если вы используете 'tableView.dequeueReusableHeaderFooterView' для повторного использования существующего представления вместо того, чтобы создавать новый каждый раз, когда вам нужно, чтобы вы не повторно добавляли' UITapGestureRecognizer' снова и снова. – Alnitak

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) 
    } 
+0

Работает также в Swift 2, спасибо! –

0

Обновление для 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") 
    } 
0

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

-(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); 

} 
Смежные вопросы