如何捕获UITableView子视图中的UIButton的任何触摸事件

3
在我的应用程序中,我使用覆盖样式来展示帮助信息。在工具栏中点击Info按钮会将一个UIButton叠加在当前主视图之上。它会绘制一张带有帮助文本和箭头的图片,指向当前导航栏和工具栏中的各个用户界面元素。
如果再次点击Info按钮,则会销毁UIButton,并且如果用户触摸了这个叠加的按钮,我也想要将其消除。这个功能运行得非常完美,但是对于我的主视图控制器——一个UITableViewController,它无法正常运行。
我的做法是创建一个UIButton并将其添加为UITableViewController中唯一的视图——UITableView的子视图。然后,我设置它来处理所有的触摸事件:
[[self masterInfoView] addTarget:self action:@selector(toggleMasterInfo:) forControlEvents:UIControlEventAllTouchEvents];
UIButton的大小与它现在覆盖的表格视图相同,如果我点击它,它会消失,但是如果我进行滚动手势(在其中按住我的手指),按钮不会将此视为触摸事件,相反,底层的表格视图处理它并滚动其行,同时移动按钮。
在转向UIButton之前,我使用UIView和各种手势识别器来实现相同的功能,以及捕获UIResponder事件,如touchesBegan:withEvent:,都有合理的结果,但没有完美的解决方案。
这不应该是很难实现的,我错过了什么?
3个回答

0

要访问表格单元格的任何子视图,请按照以下步骤进行。

1.Use the TableView delegate function of "didSelectRowAtIndexPath".
2.By above function you can get the particular index path of tabelcell.
3.Create a local object of any subview using tag value like below.

 UIButton *mybutton=(UIButton *)[[tableView cellForRowAtIndexPath:indexPath] viewWithTag:222];

0

我一直在尝试这样做,最后发现需要在将单元格返回到表数据源委托时设置操作。

[customButton addTarget:self action:@selector(/*functio name*/:) forControlEvents:/*event name*/]

;

希望这对你有用。


我的 UIButton 不是我在表视图中返回行的一部分。相反,它重叠整个表格,显示整个屏幕的帮助信息,并且一旦被点击,它应该消失。简单地点击它可以正常工作,但是滚动操作会滚动底层的表视图,这也会将我的按钮向上或向下移动。 - Richard Altenburg - Brainchild
在sib文件中创建两个视图,一个仅包含按钮,并将其背景设置为透明。然后将所有其他UI元素移动到另一个视图中。 - Mahmoud Fayez
我考虑添加一个额外的容器视图,用于容纳表视图,并在其中添加一个额外的子视图来显示我的覆盖帮助文本,但我在下面的帖子中描述的解决方法中找到了一个变通方法。 - Richard Altenburg - Brainchild

0

我决定,由于我的主要问题是由于帮助文本覆盖视图下面的表格视图即使我不想滚动也会滚动,所以我不妨使用这个:

[[self tableView] setScrollEnabled:NO];

只要帮助覆盖视图(我的UIButton)处于活动状态,我就禁用表格视图的滚动。一旦覆盖层消失,我就重新启用表格视图的滚动。

这暂时解决了我的问题,但仍然没有告诉我如何防止滚动事件穿过我的覆盖层并进入表格视图。这可能是因为我将覆盖层添加为表格视图的子视图。为了避免这种情况发生,我应该创建一个容器视图来容纳表格视图(正如Mahmoud Fayez所建议的那样)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接