22

セグメント化されたコントロール、 UIImageView などのいくつかのコントロールを含む UITableView のカスタム セクション ヘッダーを作成しました。正常に表示されますが、タップできないため、コントロールを操作できません。

このヘッダー ビューを選択可能にするにはどうすればよいですか?

4

12 に答える 12

30

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

スイフト 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 
    }

役立つかもしれません。

ハッピーコーディング。

于 2013-11-15T10:57:46.780 に答える
7

これが私のために働いたものです:

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")
}
于 2016-05-24T16:27:39.513 に答える
3

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{

}
于 2015-09-22T07:34:52.937 に答える
1

これに対する迅速な解決策:

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

次に実装

func gotoHeaderArticle() {

}

呼び出し元のビューコントローラーが UIGestureRecognizerDelegate に準拠していることを確認してください

于 2015-10-20T02:46:42.200 に答える
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
    }
}
于 2015-08-14T16:38:56.523 に答える
0

テーブルビューに複数のセクションがある場合に機能するソリューションが必要な場合、私は同じ問題を抱えていました。私が思いついた解決策は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")
}
于 2019-07-15T06:27:16.477 に答える