Прикосновения начались в UITableViewController - PullRequest
8 голосов
/ 09 июня 2011

Я определяю этот метод в моем подклассе UITableViewController:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    NSLog(@"touch began");
}

, но он не запускается.UIViewController является подклассом UIResponder, поэтому он должен работать, верно?Спасибо

Ответы [ 5 ]

5 голосов
/ 13 мая 2012

Если вы пытаетесь отклонить клавиатуру в UITableViewController, достойным решением является вызов resignFirstResponder в методе didSelectRowAtIndexPath делегата tableView.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [myTextField resignFirstResponder];

    // Rest of your actual didSelectRowAtIndexPath code ...
}
4 голосов
/ 09 июня 2011

Да, это определенно должно работать.

Убедитесь, что включено взаимодействие с пользователем для представления, которому соответствует этот контроллер.

Если представление загружается из nib / xib, убедитесь, что в качестве владельца файла указано подходящее имя класса, а выход view владельца файла подключен для правильного просмотра.

Обновление: я также вижу это поведение, используя приложение, созданное с помощью шаблона приложения на основе Nav, но с шаблоном приложения на основе View, оно работает как положено.

Я думаю, что в случае контроллера навигации табличное представление, встроенное в контроллер представления, получает событие раньше, чем это делает контроллер представления.См. Ссылку UIView (выделено мной):

Контроллеры представления сами являются потомками класса UIResponder и вставляются в цепочку респондента между управляемым корневым представлением и его суперпредставлением, котороеобычно принадлежит другому контроллеру представления. Если представление контроллера представления не обрабатывает событие , сам контроллер представления может обрабатывать событие перед передачей события в суперпредставление.

Это означает, чтоview имеет первый шанс обработать событие, и если это произойдет, контроллер представления не получит его.

Не совсем ясно, что вы пытаетесь достичь, поэтому я не уверен, какое решениепредлагает.

3 голосов
/ 12 апреля 2012

Я только что столкнулся с той же проблемой, что и оригинальная публикация.Я обошел эту проблему, создав подкласс UITableView и переопределив метод "touchesBegan".Я также создал протокол, чтобы UITableView мог вызывать метод в UITableViewController, который, в конечном счете, и хотел обработать событие «touchesBegan».

Вот заголовок для подтипа UITableView:

@protocol AGSTableViewDelegate;

@interface AGSTableView : UITableView
@property (nonatomic, weak) id<AGSTableViewDelegate> agsDelegate;
@end

@protocol AGSTableViewDelegate<NSObject>
-(void)tableViewTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
@end

И реализация:

@implementation AGSTableView

@synthesize agsDelegate;

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{    
    [super touchesBegan:touches withEvent:event];

    if (agsDelegate)
        [agsDelegate tableViewTouchesBegan:touches withEvent:event];
}
@end

И, наконец, фрагменты кода из UITableViewController:

@interface AGSWasteUpdateTableController ()<AGSTableViewDelegate>
@end

- (void)viewDidLoad
{
    AGSTableView *tableView = (AGSTableView *)[self tableView];
    tableView.agsDelegate = self;
}

-(void)tableViewTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [yourTextField resignFirstResponder];
}

Надеюсь, это поможет ...

1 голос
/ 16 марта 2015

Swift Version, потому что у меня была эта проблема:

import UIKit

class BubbleTouchesTableView: UITableView {

    // Designed to bubble up touches from a UITableView

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        super.touchesBegan(touches, withEvent: event)
        self.nextResponder()?.touchesBegan(touches, withEvent: event)
    }

    override func touchesCancelled(touches: NSSet, withEvent event: UIEvent) {
        super.touchesCancelled(touches, withEvent: event)
        self.nextResponder()?.touchesCancelled(touches, withEvent: event)
    }

    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
        super.touchesEnded(touches, withEvent: event)
        self.nextResponder()?.touchesEnded(touches, withEvent: event)
    }

    override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
        super.touchesMoved(touches, withEvent: event)
        self.nextResponder()?.touchesMoved(touches, withEvent: event)
    }

}
1 голос
/ 29 декабря 2012

Вам нужно пройти цепочку респондентов. Мы можем сделать это путем создания подкласса UITableView и переопределения метода touchesBegan (и других при необходимости), а затем передать цепочку респондентов в UITableViewController.

UITableViewTouch.h:

#import <UIKit/UIKit.h>

@interface UITableViewTouch : UITableView

@end

UITableViewTouch.m:

#import "UITableViewTouch.h"

@implementation UITableViewTouch

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    [[self nextResponder] touchesBegan:touches withEvent:event];
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesCancelled:touches withEvent:event];
    [[self nextResponder] touchesCancelled:touches withEvent:event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];
    [[self nextResponder] touchesEnded:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesMoved:touches withEvent:event];
    [[self nextResponder] touchesMoved:touches withEvent:event];
}

@end
...