web-dev-qa-db-ja.com

touchesBeganメソッドがiPhoneのUITableViewControllerクラスで呼び出されない

どうすればtouchesBegan: withEvent: UITableViewControllerクラスのメソッド?

UITableViewControllerは、UIViewControllerクラスのサブクラスです。では、なぜメソッドがUITableViewControllerで機能しないのでしょうか。

18
Confused

touchesBeganは、UIViewControllerメソッドであるだけでなく、UIViewメソッドでもあります。

これをオーバーライドするには、コントローラーではなく、UIViewまたはUITableViewをサブクラス化する必要があります。

7
Or Arbel

同様の問題があり、UITableViewのサブクラス化を伴わない別のアプローチを見つけました。これを行う別の方法は、UITableViewControllerのビューにジェスチャレコグナイザーを追加することです。

このコードをUITableViewControllerのviewDidLoadに配置しました。

UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[self.view addGestureRecognizer:tap];

そして、イベントハンドラーを実装しました:

- (void)handleTap:(UITapGestureRecognizer *)recognizer
{
    // your code goes here...
}

このソリューションがtouchesBeganを使用していないことは知っていますが、同じ問題に対する簡単なソリューションであることがわかりました。

23
Steph Sharp

これが私のために働いたUITableViewサブクラスソリューションです。 UITableViewのサブクラスを作成し、以下のようにhitTest:withEvent:をオーバーライドします。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    static UIEvent *e = nil;

    if (e != nil && e == event) {
        e = nil;
        return [super hitTest:point withEvent:event];
    }

    e = event;

    if (event.type == UIEventTypeTouches) {
        NSSet *touches = [event touchesForView:self];
        UITouch *touch = [touches anyObject];
        if (touch.phase == UITouchPhaseBegan) {
            NSLog(@"Touches began");
        }
    }
    return [super hitTest:point withEvent:event];
}
5

touchesBeganは、UIViewControllerおよびUITableViewControllerメソッドではなく、UIViewおよびUITableViewCellメソッドです。そのため、UITableViewCellのカスタムクラスを作成して、タッチイベントを認識し、タッチデリゲートが機能していることを確認できます。

  //TableViewCell.h

#import <UIKit/UIKit.h>

@class Util;

@interface TableViewCell : UITableViewCell {

}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier;

@end
   //TableViewCell.m
#import "TableViewCell.h"
@implementation TableViewCell

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier      format:(NSString*)ec_format{

    if (self) {
        self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

   }

   return self;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 {
//you receive touch here 
    NSLog(@"Category Touch %@",self.frame);


}

良い一日を過ごしてください

4

IN Swift-Swift 2の解決策を探しているときに、この質問に出くわしました。@ Steph Sharpによって投稿された回答は、=の問題を解決するのに役立ちました。 Swiftだから私はここに投稿しますが、ここに行きます:

class CalcOneTableViewController: UITableViewController {
      override func viewDidLoad() {
         super.viewDidLoad()
         let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "handleTap:")
         self.view.addGestureRecognizer(tap)
}

関数

func handleTap(recognizer: UITapGestureRecognizer) {
    // Do your thing.
}
2
Led