Objective c 触摸开始于UITableViewController

Objective c 触摸开始于UITableViewController,objective-c,cocoa-touch,uiviewcontroller,uitableview,uiresponder,Objective C,Cocoa Touch,Uiviewcontroller,Uitableview,Uiresponder,我正在UITableViewController子类中定义此方法: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesBegan:touches withEvent:event]; NSLog(@"touch began"); } 但它并没有被触发。UIViewController是UIResponder的一个子类,所以它应该可以工作,对吗? 谢谢是的,那肯定有用 确

我正在UITableViewController子类中定义此方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    NSLog(@"touch began");
}
但它并没有被触发。UIViewController是UIResponder的一个子类,所以它应该可以工作,对吗?
谢谢

是的,那肯定有用

确保为该控制器对应的视图设置了“已启用用户交互”

如果视图是从nib/xib加载的,请确保将文件的所有者设置为适当的类名,并且将文件所有者的
视图
出口连接到适当的视图

更新:我也看到了这种行为,使用基于导航的应用程序模板构建的应用程序,但使用基于视图的应用程序模板,它可以正常工作

我认为在导航控制器的情况下,嵌入在视图控制器中的表视图比视图控制器先获取事件。见(我的重点):

视图控制器本身是独立的 UIResponder类的后代 和被插入到响应程序中 托管根视图之间的链 以及它的superview 属于另一种观点 控制器如果视图控制器的视图未处理事件,则 视图控制器本身具有该选项 在通过之前处理事件的方法 事件将沿着superview显示

这意味着视图有第一次机会处理事件,如果有,视图控制器将无法获得它


不太清楚你想要完成什么,所以我不确定该提供什么解决方案

我刚刚遇到了与原始帖子完全相同的问题。我通过创建UITableView的一个子类并重写“touchesbeent”方法绕过了这个问题。我还创建了一个协议,以便UITableView可以调用UITableViewController上的一个方法,这是我最终想要处理“touchesStart”事件的地方

以下是UITableView子类型的标题:

@protocol AGSTableViewDelegate;

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

@protocol AGSTableViewDelegate<NSObject>
-(void)tableViewTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)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];
}
@接口AGSWasteUpdateTableController()
@结束
-(无效)viewDidLoad
{
AGSTableView*tableView=(AGSTableView*)[self tableView];
tableView.agsDelegate=self;
}
-(void)TableView触摸开始:(NSSet*)触摸事件:(UIEvent*)事件
{
[yourTextField辞职FirstResponder];
}

希望这对您有所帮助……

如果您试图关闭UITableViewController中的键盘,一个不错的解决方案是在tableView委托的didSelectRowAtIndexPath方法中调用resignFirstResponder

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

    // Rest of your actual didSelectRowAtIndexPath code ...
}

你需要将触动传递到应答器链。我们可以通过将UITableView子类化并覆盖touchesbreated(以及其他必要的内容),然后将响应器链上的触动传递给UITableViewController来实现这一点

UITableViewTouch.h:

#import <UIKit/UIKit.h>

@interface UITableViewTouch : UITableView

@end

Swift版本,因为我刚刚遇到了这个问题:

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)
    }

}

嘿,谢谢你的回复。我制作了一个新的XCode导航项目,并在UITableViewController子类中添加了touchesBegin方法(没有改变任何其他内容),但它不起作用。感谢您的详细回答。基本上,我有一个UIKeyboardTypeNumber pad类型的UIExtField,每当用户单击屏幕上的任何位置时,我都想退出first responder(解除键盘)。@zpasternack我试图在用户将手指放在表视图上时立即在屏幕上显示某些内容,并在用户抬起手指时将其隐藏。鉴于事件并不像您所描述的那样都从表视图中冒泡出来,我如何才能完成我要做的事情?嘿,我也遇到了类似的问题。从上面接受的答案中的评论来看,@sumderungHAY显然没有解决他的问题,但它仍然被接受!但是你的解决方案对我有效!!!
#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
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)
    }

}