UITableView 的 tableHeaderView 中的 UIButton 无法响应触摸

5

我感觉自己像个白痴,因为我无法让这个工作起来,而且SO上的其他答案也没有给我任何帮助。

我有一个非常简单的UIView,我在.xib文件中定义并将其加载为UITableViewControllertableHeaderView

UIView* headerView = [[NSBundle mainBundle] loadNibNamed:@"ProfileHeaderView" owner:self options:nil][0];
self.tableView.tableHeaderView = headerView;

文件的所有者 .xib 的标题设置为我的控制器类,到目前为止这个工作正常。我的出口连接正确,我可以将标签设置为它们的正确值等等。
但是,当我在我的headerView中添加了一个UIButton时,无论我尝试什么都无法响应触摸。
我已经确认了头部和按钮的框架是正确的,并且都具有userInteractionEnabled设置为YES。
我真的想不出为什么这行不通。我真的没有任何复杂的操作。
以下是一些调试信息:
po self.tableView.tableHeaderView
<UIView: 0x17ef5420; frame = (0 0; 320 194); autoresize = W+H; layer = <CALayer: 0x17eda4a0>>

po self.loginButton
<UIButton: 0x17ec1630; frame = (80 164; 160 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x17eec760>>

更新: 我发现了一些新的证据。上述内容记录在viewDidLoad中,而且框架有它们正确的值。然而,如果我在tableView:didSelectRowAtIndexPath:中设置断点,我注意到我的页眉视图框架高度不知何故已经改变为130像素!

po self.profileHeaderView
<UIView: 0x15eb6790; frame = (0 0; 320 130); autoresize = W+H; layer = <CALayer: 0x15eb67f0>>

我不知道是什么原因导致这个问题!当然,现在我知道了,如果我在viewDidAppear:里明确将框架高度设置为194,它就可以正常工作。但是我显然想要修复导致框架首先发生变化的问题。

标题仍然可以正确绘制,并且在渲染时具有正确的高度(194像素),但由于某种原因,它的框架会在某个时候发生变化,这会导致按钮超出其框架而无法接收触摸。

是什么导致标题的框架发生这种变化?我根本没有设置任何约束。


你的按钮有目标或选择器吗?你是如何添加这个按钮的,使用 Interface Builder 吗?实际上,你没有发布任何与按钮接收触摸相关的代码。 - JDM
是的,按钮已经添加到了xib文件中作为表头视图,并通过输出动作进行了连接。这很典型。但是当触摸时,按钮甚至不会高亮显示,所以它甚至没有达到那个阶段。 - devios1
1
你能否打印 po self.loginButton.superview - Burhanuddin Sunelwala
1
我遇到了同样的问题。你解决了吗? - flohei
1
我的解决方案是放弃尝试在单独的.xib文件中完成此操作,而是通过将UIView拖到表视图上,将其作为表视图标题添加到故事板中。 - devios1
是的,我也尝试过那个方法,它对我也有效。虽然这不是我的首选解决方案。 - flohei
2个回答

5

尝试使用这个,

    [button sendActionsForControlEvents:UIControlEventTouchUpInside];

如果这正确地调用了您的目标/选择器,则问题出在您的视图层次结构上。否则,问题在于您没有为按钮正确编码目标/选择器。


这个可以工作。一定与视图层次有关。有什么提示需要检查的吗?一切似乎都完全正确。 - devios1
请看我的更新。我发现了视图层次结构的问题,但现在我需要弄清楚是什么原因导致了这个问题。 - devios1
也许你会对tableHeaderView和section header view感到困惑。我尝试了同样的操作,我可以清楚地在按钮点击期间调用按钮动作。请参见链接https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableView_Class/#//apple_ref/occ/instp/UITableView/tableHeaderView。请发布您的代码,以便我们可以轻松调试它。 - Jaffer Sheriff

0
也许你可以将按钮的背景颜色设置为红色或其他颜色。你可以写这个代码 'self bringSubviewToFront:xx',这意味着你将按钮设置到了顶层视图。

我会尝试调用bringToFront函数,但我怀疑这并不会起作用,因为根本没有重叠的视图。 - devios1
你可以写成这样:xx.clipsToBounds = YES; 其中,xx代表你的子视图。 - Teen Ma

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