触摸开始于UITableViewController

时间:2011-06-08 22:53:21

标签: 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的子类,所以它应该可以工作,对吧? 感谢

5 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:4)

是的,这肯定有用。

确保为此控制器对应的视图设置了User Interaction Enabled。

如果视图是从nib / xib加载的,请确保将文件所有者设置为相应的类名,并将文件所有者的view插座连接到正确的视图。

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

我认为在导航控制器的情况下,嵌入在视图控制器中的表视图在视图控制器之前获取事件。请参阅UIView reference(强调我的):

  

查看控制器本身   UIResponder类的后代   并插入响应者   托管根视图之间的链   和它的超级视图,通常   属于不同的观点   控制器。 如果视图控制器的视图不处理事件,则   视图控制器本身有选项   在通过之前处理事件   事件一直到超级视图。

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

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

答案 2 :(得分:3)

我刚刚遇到了原始帖子的确切问题。我通过创建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];
}

希望这会有所帮助......

答案 3 :(得分:1)

您需要将响应传递给响应者链。我们可以通过继承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

答案 4 :(得分:1)

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

}