堆叠UITableViews不会在其视图下传递触摸事件

pra*_*jul 6 uitableview uiview uievent

我有3个UIViews堆叠在另一个上面

UITableview
planeView
rootView

TableView位于顶部,rootView位于底部.(因为TableView位于其上,因此rootView不可见)

我在rootView中实现了以下代码

/*code in rootView*/



- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {}  

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {} 
Run Code Online (Sandbox Code Playgroud)

期望在触摸或移动最顶层视图(即TableView)时调用这些函数,但相反没有调用任何函数.

我还尝试在TableView中放入以下代码,以便调用rootView方法

 /*code in TableView so that the rootView methods are called(TableView is the subview of rootView)*/

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
 {
[super touchesBegan:touches withEvent:event];
[self.superview touchesBegan:touches withEvent:event];
 }
Run Code Online (Sandbox Code Playgroud)

正如所料,它确实如此,但问题是TableView代表喜欢

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath    
Run Code Online (Sandbox Code Playgroud)

不叫.

是否有任何方法可以确保在TableView类(didSelectRow :)中实现的TableView委托和rootView中的touchesBegan:,touchesMoved ..函数也相应地调用?

即,当我点击TableCell中的两个(didSelectRow:atIndex)函数 - > TableView和(touchesBegan和touchesEnd)方法 - > rootView被调用.

Mus*_*sis 6

在你的子类中,UITableView你应该有这样的触摸方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.nextResponder touchesBegan:touches withEvent:event];
    [super touchesBegan:touches withEvent:event];
}
Run Code Online (Sandbox Code Playgroud)

这里的不同之处在于,您将触摸传递给下一个响应者而不是超级视图,并且将触摸传递给超级之前您正在执行此操作.

然后在planeView你需要传递这样的接触:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.superview touchesBegan:touches withEvent:event];
}
Run Code Online (Sandbox Code Playgroud)

请记住,这仍然可能无法完全按预期工作.UITableView在引擎盖下做了很多响应者链的修改,以使它看起来好像一个UITableView(实际上是一个复杂的子视图集合)只是另一个视图,如按钮或标签.