23

NIB ファイルを使用して、カスタム テーブル ビュー セルをレイアウトしています。このセルには、lblName というアウトレットのラベルがあります。このラベルに UITapGestureRecognizer を追加しても、関連付けられたイベントは発生しません。私は userInteractionEnabled = YES です。

問題は、UILabel が TableView にあり、テーブル/セル ビューがタップをインターセプトしていることだと思います。これについて何かできることはありますか?

私がやりたいのは、UILabel が押されたときにカスタム アクションを実行することだけです! 私が見たこれを行うための解決策はすべてばかげています。標準の工具セットを使えば簡単です。しかし、明らかにそうではありません。

私が使用しているコードは次のとおりです。

- (void)tapAction {
    NSLog(@"Tap action");
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib

    UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; 
    [recognizer setNumberOfTapsRequired:1];
    //lblName.userInteractionEnabled = true;  (setting this in Interface Builder)
    [lblName addGestureRecognizer:recognizer];
}
4

10 に答える 10

23

簡単な方法:

そのラベルの上部にある非表示のボタンを使用することもできます。そのため、そのラベルに tapGesture を追加する作業が軽減されます。

別の方法:

そのための IBOutlet を作成しないでくださいUILabel。その際、カスタム クラスの実装ファイルにアウトレットを追加します。他のファイルにはアクセスできません。カスタムクラスにそのラベルのタグを設定し、メソッドIBにコードを記述しますcellForRowAtIndexPath:

更新しました:

cellForRowAtIndexPath:メソッドでは、

for(UIView *view in cell.contentViews.subviews) {
    if(view.tag == 1) {
        UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)];
        [tap setNumberOfTapsRequired:1];
        [view addGestureRecognizer:tap];
    }
}
于 2012-04-10T10:43:18.743 に答える
14
UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)]; 
[recognizer setNumberOfTapsRequired:1];
lblName.userInteractionEnabled = YES;  
[lblName addGestureRecognizer:recognizer];
于 2013-07-24T09:32:02.440 に答える
10

これを行うと問題なく動作します:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
   ...
   // create you cell
   UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
   [lbl setText:@"example"];
   [lbl setUserInteractionEnabled:YES];
   [cell.contentView addSubview:lbl];
   UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self    action:@selector(tapAction:)];
   tap.tag = [NSIndexPath row];
   [tap setNumberOfTapsRequired:1];
   [lbl addGestureRecognizer:tap];
   ... 
}

- (void)tapAction:(id)sender {
  switch(((UITapGestureRecognizer *)sender).view.tag) {
     case 0:
          // code
          break;
     case 1:
         // code
         break;
      ....
     }
}

IBでUILabelを作成する場合でも

于 2012-04-09T20:16:07.663 に答える
7

以下のコードを使用して、UITableView セルの UILable にタップ ジェスチャを追加できます。

UITapGestureRecognizer *tapGeature = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(lblClick:)];
tapGeature.delegate =self;
tapGeature.numberOfTapsRequired = 1;

cell.lbl.userInteractionEnabled = YES;
[cell.lbl addGestureRecognizer:tapGeature];

そしてセレクターメソッドにアクセスする

- (void)lblClick:(UITapGestureRecognizer *)tapGesture {
    UILabel *label = (UILabel *)tapGesture.view;
    NSLog(@"Lable tag is ::%ld",(long)label.tag);
}

スイフト用

let tapGesture : UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: #selector(lblClick(tapGesture:)))
tapGesture.delegate = self
tapGesture.numberOfTapsRequired = 1
cell.lbl.userInteractionEnabled = true
cell.lbl.tag = indexPath.row
cell.lbl.addGestureRecognizer(tapGesture)

func lblClick(tapGesture:UITapGestureRecognizer){
   print("Lable tag is:\(tapGesture.view!.tag)")
}
于 2015-10-02T07:29:49.360 に答える
1

タップ ジェスチャを UILabel に割り当て、ユーザー インタラクションを有効に設定すると、コールバック関数で、セル ビューからインデックスパスを見つけることができますが、スーパービューのネストを検索できます。

- (UITableViewCell *) findCellInSuperview:(UIView *)view
{
UITableViewCell *cell = nil;

    NSString *className = NSStringFromClass([[view superview] class]);
    if ([className isEqualToString:@"UITableViewCell"]) {
        cell = (UITableViewCell *)[view superview];
    } else {
        if ([view superview] != nil) {
            cell = [self findCellInSuperview:[view superview]];
        }
    }

return cell;
}
于 2014-10-20T16:46:43.370 に答える
1

セルの -awakeFromNib メソッドに next を追加できます

UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRecognizerAction:)];
[self.yourLabel setUserInteractionEnabled:YES];
[self.yourLabel addGestureRecognizer:gesture];
于 2014-07-18T08:31:27.567 に答える
0

Dinesh が提案した方法は、プロパティ変数を使用して for ループなしで機能します。

UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)];
[tap setNumberOfTapsRequired:1];
[self.myUILabel addGestureRecognizer:tap];
于 2013-07-11T17:28:36.617 に答える
0

Swift の場合、これを cellForRowAtIndexPath メソッド内に追加できます。

var tap = UITapGestureRecognizer(target: self, action: "labelTapped")
tap.numberOfTapsRequired = 1
cell.label.addGestureRecognizer(tap)
cell.label.tag = indexPath.row

それではアクションへ

func labelTapped(gesture: UITapGestureRecognizer) {
    let indexPath = NSIndexPath(forRow: gesture.view!.tag, inSection: 0)
    let cell = tableView.cellForRowAtIndexPath(indexPath) as UITableViewCell

    // Do whatever you want.
}
于 2015-05-09T13:41:47.390 に答える