Ios5 如何知道uitableview在为空时被按下

Ios5 如何知道uitableview在为空时被按下,ios5,uitableview,uibutton,uigesturerecognizer,Ios5,Uitableview,Uibutton,Uigesturerecognizer,我正在制作聊天应用程序,聊天窗口中的uitableviewcells中有uilabels。最初键盘会出现,但当用户触摸uitableview上的任何位置时,我会将聊天窗口设置为全屏(显示键盘) 我找不到实现这一目标的方法/诀窍 我尝试了以下方法:通过使用tableview:DidSelectRowatineXpath,我可以做到这一点,但用户需要按下现有的uitableviewcell。但我想了解媒体,即使uitableview是空的 注意:我的聊天桌视图是交互式的e.x。某些行将包括需要按下的

我正在制作聊天应用程序,聊天窗口中的uitableviewcells中有uilabels。最初键盘会出现,但当用户触摸uitableview上的任何位置时,我会将聊天窗口设置为全屏(显示键盘)

我找不到实现这一目标的方法/诀窍

我尝试了以下方法:通过使用tableview:DidSelectRowatineXpath,我可以做到这一点,但用户需要按下现有的uitableviewcell。但我想了解媒体,即使uitableview是空的

注意:我的聊天桌视图是交互式的e.x。某些行将包括需要按下的图像按钮,因此我不能将不可见的按钮放在uitableview上

谢谢你的想法


Aytunc Isseven

您要做的是在UITableView中添加一个手势识别器,以响应相应的手势。我建议不要使用UITableView识别器,因为UITableView已经在使用点击选择单元格,因此您可能需要尝试UILongPressGestureRecognitor。我收集了一个小样本,说明如何做到这一点,如下所示:

- (void)handleLongPressFrom:(UILongPressGestureRecognizer *)recognizer {
    NSLog(@"handleLongPressFrom: %@", recognizer);
    // Add real code here
}
在我的viewDidLoad中,我执行了以下操作:

UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressFrom:)];
[self.tableView addGestureRecognizer:gesture];
和handleLongPressFrom:的如下所示:

- (void)handleLongPressFrom:(UILongPressGestureRecognizer *)recognizer {
    NSLog(@"handleLongPressFrom: %@", recognizer);
    // Add real code here
}
可以找到手势的完整列表

哦,如果您确实想继续使用tap,请查看堆栈溢出问题。我不知道所介绍的方法是否完全有效,但这将是一个很好的开始


将UITapGestureRecognitor与UITableView一起使用: 好的,由于轻触手势似乎是适合您的用例的正确手势,您可以尝试并执行以下操作。第1步是设置手势识别器,如上所述,使用轻触手势而不是长按手势

viewDidLoad中的代码非常相似,但有一个重要的补充

UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
// we need to set the gesture delegate so we can allow the tap to pass through to the
// UITableViewCell if necessary.
gesture.delegate = self;
[self.tableView addGestureRecognizer:gesture];
handleTapFrom:函数与作为参数的不同手势识别器几乎相同

- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer {
    NSLog(@"handleTapFrom: %@", recognizer);
    // Add real code here
}
这种方法的主要变化是我们需要实现UIGestureRecognitzerDelegate协议。由于我们的目标是允许点击手势通过UITableView传递到其子视图(即UITableViewCell及其组件),因此我们需要实现手势识别器:shouldReceiveTouch:功能。下面的实现应该包括您正在尝试的内容

#pragma mark UIGestureRecognizerDelegate methods
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    // If the view that is touched is not the view associated with this view's table view, but
    // is one of the sub-views, we should not recognize the touch.
    if (touch.view != self.tableView && [touch.view isDescendantOfView:self.tableView]) {
        return NO;
    }
    return YES;
}

如果测试所针对的视图与执行测试的视图相同,IsDescendaToView:函数将返回YES,因此我们需要单独考虑这种情况。您可以通过使用GestureRecognitizer.view而不是self.tableView来泛化此函数,但我认为在这种情况下没有必要这样做。

诀窍是让您的viewController在视图上放置一个点击识别器,但通过从委托方法“GestureRecognitizer ShouldBegin”返回“否”,使其始终选择退出。这样,每次触摸视图时都应该调用GestureRecognitizer,但您不会干扰表的正常事件处理

    - (void)viewDidLoad {
      [super viewDidLoad];
      [self detectTouchesOnView:self.tableView];
    }

    - (void)detectTouchesOnView:(UIView*)theView {
      UITapGestureRecognizer* tapR = [[UITapGestureRecognizer alloc]initWithTarget:nil action:nil];
      tapR.delegate = self;
      [theView addGestureRecognizer:tapR];
    }

    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
       // React to the UITableView being touched E.G. by hiding the keyboard as below.
      [self.view endEditing:YES]; 
      return NO;
    }

谢谢Chad,我不想使用longpress手势,因为iphone用户没有这样的习惯。我需要一个水龙头。但如果我这样做,它会覆盖uitableviewcell的点击吗?是否有办法区分uitableview点击手势和uitableviewcell didselectrowatindexpath?谢谢,我想可能是这样的。因此,您试图实现的是当用户触摸键盘外部时,将其关闭?哦,如果您在tableview中添加了点击手势,它确实会吃掉UITableViewCell点击,但有一个解决方法,这只是让事情变得有点复杂。我刚刚更新了我的答案,如果点击发生在UITableViewCell,我会允许点击手势传递到UITableViewCell。如果这不起作用/不是你所需要的,请告诉我。我刚刚开始应用你的答案,Chad,我会很快给出反馈,谢谢