どうすればtouchesBegan: withEvent:
UITableViewControllerクラスのメソッド?
UITableViewControllerは、UIViewControllerクラスのサブクラスです。では、なぜメソッドがUITableViewControllerで機能しないのでしょうか。
touchesBeganは、UIViewControllerメソッドであるだけでなく、UIViewメソッドでもあります。
これをオーバーライドするには、コントローラーではなく、UIViewまたはUITableViewをサブクラス化する必要があります。
同様の問題があり、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を使用していないことは知っていますが、同じ問題に対する簡単なソリューションであることがわかりました。
これが私のために働いた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];
}
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);
}
良い一日を過ごしてください
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.
}