为啥当我添加 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 会添加空格?