如何知道uitableview在空的时候被按下

时间:2012-05-25 13:48:24

标签: ios5 uitableview uibutton uigesturerecognizer

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

我无法找到完成此任务的方法/技巧。

我尝试了以下方法:通过使用tableview:didselectrowatindexpath,我能够做到但是,用户需要按现有的uitableviewcell。但即使uitableview是空的,我也想了解媒体..

注意:我的聊天表视图是交互式e.x.有些行会包含需要按下的图像按钮,所以我不能把一个看不见的按钮放到uitableview上。

谢谢你的想法

Aytunc Isseven

2 个答案:

答案 0 :(得分:1)

您要做的是向UITableView添加一个手势识别器,以响应相应的手势。我建议不要使用UITapGestureRecognizer,因为UITableView已经使用水龙头来选择单元格,所以你可能想尝试UILongPressGestureRecognizer。我把如何做到这一点的小样本放在一起如下:

在我的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
}

可以找到完整的手势列表here

哦,如果您确实想要使用tap,请查看this堆栈溢出问题。我不知道所提出的方法是否有效,但它是一个很好的起点。


将UITapGestureRecognizer与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:function与几乎不同的手势识别器作为参数几乎相同。

- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer {
    NSLog(@"handleTapFrom: %@", recognizer);
    // Add real code here
}

这种方法的主要变化是我们需要实现UIGestureRecognizerDelegate协议。由于我们的目标是允许轻击手势通过UITableView传递到它的子视图(即UITableViewCell及其组件),我们需要实现gestureRecognizer:shouldRecieveTouch:function。以下实现应涵盖您正在尝试的内容。

#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;
}

如果正在测试的视图与执行测试的视图相同,则isDescendantOfView:函数返回YES,因此我们需要单独适应该情况。您可以使用gestureRecognizer.view而不是self.tableView来生成此功能,但在这种情况下我并不认为这是必要的。

答案 1 :(得分:1)

诀窍是让你的viewController在视图上放置一个tap识别器,但总是通过从委托方法" gestureRecognizerShouldBegin"返回NO来选择退出。这样就可以在视图上的每次触摸时调用gestureRecognizerShouldBegin,但是你不会干扰表的正常事件处理。

    - (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;
    }