touchesBegan没有回应

时间:2012-03-06 15:38:29

标签: iphone objective-c ios

我想使用touchesBegan方法来了解用户在TableView中的UITextField之外何时录制。

我有一个包含TableView的UIView,我有以下方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

NSLog(@"See a tap gesture");
UITouch *touch = [touches anyObject];
if(touch.phase==UITouchPhaseBegan){
    //find first response view
    for (UIView *view in [self.view subviews]) {
        if ([view isFirstResponder]) {
            [view resignFirstResponder];
            break;
        }
    }
}


[super touchesBegan:touches withEvent:event];

}

我的self.view和我的self.tableView都将userInteractionEnabled设置为YES,但由于某种原因,touchesBegan从未被触发。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

如果您的UIView包含UITableView,则表格视图位于响应者链的顶部,触摸事件不会进入您的视图。但是可能有更好的方法来做到这一点。你在追求什么?

更新

实施UITextFieldDeletate的{​​{1}}方法拦截“返回”按下:

textFieldShouldReturn:

此外,UITableViewDelegate是一个UIScrollViewDelegate,因此您可以挂钩这些方法以确定用户何时与表视图交互。

一般来说,我认为您不必担心当用户触摸键盘时立即解除键盘,特别是如果您在同一屏幕上有其他文本输入。

MOAR

好的,公平的,但当你通过复合透明视图拦截触摸事件时,事情开始变得复杂(这些视图也会变得昂贵),等等。而且你永远不会知道将来会产生什么影响,不仅是为了用户,还有你想要在未来升级应用程序的程序员。

为什么不保持简单?如何只是一个'完成'-(BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; } ,或者在键盘/选择器ala Mobile Safari上滑动的一点半透明UIBarButtonItem怎么样?这些解决方案对用户来说是可以接受的,并且可以使他的生活更轻松。通过将工件和功能分离为模块化单元,它们确实使开发更容易。

最后一点说明

使用UITapGestureRecognizer我认为在你的情况下很难做到。我担心你添加到表格视图中的任何点击识别器都会阻止行选择或将控制移动到另一个UI元素(文本字段,开关等)。

答案 1 :(得分:0)

确保您已将对象设置为处理这些触摸事件:

[myButton addTarget:self action:@selector(buttonTouch:withEvent:) forControlEvents:UIControlEventTouchUpInside];

然后在您声明的方法中处理触摸事件:

- (IBAction) buttonTouch:(id) sender withEvent:(UIEvent *) event

针对UIView进行了更新(假设您已经创建并连接了插座):

[myView addTarget:self action:@selector(myTouchEvent:withEvent:) forControlEvents:UIControlEventTouchUpInside];

然后:

- (IBAction) myTouchEvent:(id) sender withEvent:(UIEvent *) event

既然我明白你要做什么(在触摸文本框外面时忽略键盘),有一个简单的解决方案适用于几乎所有场景。)

步骤1 - 创建一个与放置TableViewController的视图大小相同的按钮。(大按钮)。 第2步 - 将该按钮发送到后面(编辑 - >排列 - >发送到后面) 第3步 - 将IBAction连接到该按钮并将其命名为dismissKeyboardButtonPressed(提示如果您尚未使用助理编辑器,则应该是) 第4步 - 在IBAction方法中放入(假设你的TextField名为myTextField):

[myTextField resignFirstResponder];

第5步 - 运行它。无论何时触摸文本框外部视图中的任何位置,都会关闭键盘。

这是我几乎在任何时候使用TextField在视图上使用的方法,并且在触摸TextField外部时需要关闭KB。

答案 2 :(得分:0)

尝试在表格视图中添加点按手势识别器。这样你就应该能够允许正常行为以及捕捉点击事件来做你额外的事情。

答案 3 :(得分:0)

我在我的一个应用程序中实现了类似的功能,我确实使用了textFields而不是textViews,但它仍然可以工作。我用了

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

如果没有进行任何检查,如果用户点击resignFirstResponder方法被调用,但如果用户点击textView,则会触发它再次成为第一个响应者,导致没有明显的变化。我在一个应用程序上实现了这个概念,在一个视图上有9个textFields,我还没有遇到问题。