我在UITableViewController子类中定义了这个方法:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
NSLog(@"touch began");
}
但它没有被触发。 UIViewController是UIResponder的子类,所以它应该可以工作,对吧? 感谢
答案 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)
}
}