Ответ 1
touchhesBegan также является методом UIView, помимо метода UIViewController.
чтобы переопределить его, вам нужно подклассифицировать UIView или UITableView, а не контроллеры.
Как использовать метод touchesBegan: withEvent:
в классе UITableViewController?
UITableViewController - это подкласс класса UIViewController. Итак, почему метод не работает в UITableViewController?
touchhesBegan также является методом UIView, помимо метода UIViewController.
чтобы переопределить его, вам нужно подклассифицировать 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...
}
Я знаю, что это решение не использует touchhesBegan, но я обнаружил, что это простое решение той же проблемы.
touchhesBegan - это метод UIView и UITableViewCell, а не метод UIViewController и UITableViewController. поэтому вы можете создать пользовательский класс для UITableViewCell, который распознает событие touch и сенсорный делегат, он работает для меня.
//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);
}
иметь хороший день
Вот решение подкласса 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];
}
В 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.
}