为啥当我添加 UITapGestureRecognizer 处理程序方法时 TableView 委托方法停止工作

Posted

技术标签:

【中文标题】为啥当我添加 UITapGestureRecognizer 处理程序方法时 TableView 委托方法停止工作【英文标题】:Why does the TableView delegate methods stop working when I add a UITapGestureRecognizer handler method为什么当我添加 UITapGestureRecognizer 处理程序方法时 TableView 委托方法停止工作 【发布时间】:2014-05-10 00:06:28 【问题描述】:

我有一个 UITableViewController 和一个在弹出窗口中使用的 xib。在我尝试将 UITapGestureRecognizer 添加到视图之前,它工作正常。将 tableview 作为一个 outlet 集合连接到 UITapGestureRecognizer,当用户点击 table 中的一个项目时,点击处理程序会触发,但 tableview 的 didSelectRowAtIndexPath 方法不再触发。

我想要做的是获取水龙头的位置,这样我就可以将下一个弹出框扔到一个合理的位置。也许有更好的方法来做到这一点?

这就是我的 tableview 接线的样子...

这是识别器的接线...

这是我的点击处理程序,当连接时,当用户选择一个项目时触发正常。

- (IBAction)tapHandler:(UITapGestureRecognizer *)sender 
    if (sender.state == UIGestureRecognizerStateEnded) 
        tapPosition = [sender locationInView:self.view];
    

这里是 didselectrowAtIndexPath 方法。除非我连接 tapGestureRecognizer...

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
   [myPO dismissPopoverAnimated:YES];
   [self.delegate popupListItemSelected:self withItemRow:indexPath.row item:[listItems objectAtIndex:indexPath.row]];

这是我的接口文件的适用部分。所有对象都被合成...

#import <UIKit/UIKit.h>

@protocol PopUpListViewControllerDelegate;

@interface PopUpListViewController : UITableViewController 
   id<PopUpListViewControllerDelegate> delegate;
   IBOutlet UITableView *poupListTableView;
   UIPopoverController *myPO;
   NSMutableArray *listItems;
   IBOutlet UITapGestureRecognizer *tapRecognizer;   

@property (assign) id<PopUpListViewControllerDelegate> delegate;
@property (retain, nonatomic) IBOutlet UITableView *poupListTableView;
@property (retain, nonatomic) NSMutableArray *listItems;

@property (retain, nonatomic) IBOutlet UITapGestureRecognizer *tapRecognizer;
- (IBAction)tapHandler:(UITapGestureRecognizer *)sender;
- (CGPoint)getTappedPosition;

@end

【问题讨论】:

轻击手势识别器正在吃用于表格视图的轻击。你期望这如何工作?你不能一边吃蛋糕一边吃…… 好的。所以我无法以这种方式获得水龙头位置。这是基本问题。您可以 presentPopoverFromRect 或 presentPopoverFromBarButtonItem 但如果您要从弹出框中的选定项目中弹出另一个弹出框,您如何在靠近用户点击的位置呈现新的弹出框? 您不应该同时放置两个弹出框,这样就不会出现问题。当用户点击弹出框的表格行时,通常的做法是将新视图推送到导航控制器上(在同一个弹出框内)。 我看到了您的其他答案,并将尝试使用您的建议,但在参考您的评论时,我并没有尝试同时放置 2 个弹出框。用户获得一个弹出框,并根据他们选择的内容关闭弹出框并显示另一个弹出框,其内容基于他们在第一个弹出框中选择的内容。哦!我明白你在说什么......使用相同的弹出框。有趣,但它可能会很困难,因为第二个弹出框的数据是从一个 URL 请求中检索到 Web 服务器的。打算试试看。 马克,谢谢你让我直截了当。重新加载弹出框效果很好!请将您的建议作为对我的问题的答案发布,以便我将其标记为已回答。我相信您发布的答案也会有效,但重新加载效果会更好。 【参考方案1】:

一种选择可能是使用点击处理程序中的 CGPoint 并使用 UITableView 方法找到相应的行:

- (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point;

所以,一切都可能由您的 tapHandler 处理:(警告!未经测试的伪代码!)

- (IBAction)tapHandler:(UITapGestureRecognizer *)sender 

    if (sender.state == UIGestureRecognizerStateEnded) 
        tapPosition = [sender locationInView:self.view];

        // use the appropriate name for your tableView, of course.
        CGPoint pointInTable = [sender locationInView:self.tableView];
        NSIndexPath * indexPath = [self.tableView indexPathForRowAtPoint:pointInTable];

       [myPO dismissPopoverAnimated:YES];
       [self.delegate popupListItemSelected:self withItemRow:indexPath.row item:[listItems objectAtIndex:indexPath.row]];
    

【讨论】:

以上是关于为啥当我添加 UITapGestureRecognizer 处理程序方法时 TableView 委托方法停止工作的主要内容,如果未能解决你的问题,请参考以下文章

当我应该在 boostrap 轮播中添加活动类时,为啥要在左边添加类

当我添加自动布局约束时,为啥我的 textview 不显示?

为啥当我在 cfoutput 中调用函数时,ColdFusion 会添加空格?

为啥当我添加 UITapGestureRecognizer 处理程序方法时 TableView 委托方法停止工作

为啥当我添加一个选择选项来选择表单字段时不会更改为有效?

当我添加游戏循环时,为啥我的 Java 游戏会崩溃?