我将3个UIView堆叠在另一个
之上的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 {}
期望在触摸或移动最顶层视图(即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];
}
正如所料,它是这样做的,但问题是TableView委托像
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
未被调用。
有没有什么方法可以确保在TableView类(didSelectRow :)中实现的TableView委托和rootView中的touchesBegan:,touchesMoved ..函数也会相应调用?
即当我点击TableCell时(didSelectRow:atIndex)函数 - >调用 - > rootView中的TableView和(touchesBegan和touchesEnd)方法。
答案 0 :(得分:5)
在UITableView
的子类中,你应该有这样的触摸方法:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.nextResponder touchesBegan:touches withEvent:event];
[super touchesBegan:touches withEvent:event];
}
这里的不同之处在于,您将触摸传递给下一个响应者而不是超级视图,并且在将触摸传递给super之前,您正在执行此操作。
然后在planeView
中,您需要传递这样的内容:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.superview touchesBegan:touches withEvent:event];
}
请注意,这仍然可能无法完全按预期工作。 UITableView
在引擎盖下对响应者链进行了大量修改,以使其看起来好像UITableView
(实际上是一个复杂的子视图集合)只是另一个视图,如按钮或标签。
答案 1 :(得分:0)
解决它的原因很简单:
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let view = super.hitTest(point, with: event)
return view == self ? nil : view
}
参考这篇文章:https://medium.com/@nguyenminhphuc/how-to-pass-ui-events-through-views-in-ios-c1be9ab1626b