UITableView tableHeaderView中的UIButton没有响应触摸
Posted
技术标签:
【中文标题】UITableView tableHeaderView中的UIButton没有响应触摸【英文标题】:UIButton in UITableView tableHeaderView not responding to touches 【发布时间】:2015-04-01 00:14:06 【问题描述】:好吧,我觉得自己像个白痴,我无法让这个工作,而且关于 SO 的其他答案都没有让我到任何地方。
我有一个非常简单的UIView
,我在 .xib 中定义了它,并且正在加载为我的UITableViewController
的tableHeaderView
:
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 px),但由于某种原因,它的框架在某些时候发生了变化,这导致按钮落在其框架之外,因此没有接收触摸。
这样会改变标题的框架吗?我根本没有设置任何限制。
【问题讨论】:
你的按钮有目标/选择器吗? IB,你是如何添加按钮的?您没有发布任何与按钮接收触摸实际相关的代码。 是的,该按钮已添加到标题视图的 xib 中,并通过出口操作进行连接。很典型。但是按钮在被触摸时甚至不会突出显示,所以它甚至没有走那么远。 你也可以打印po self.loginButton.superview
我遇到了同样的问题。你弄明白了吗?
@flohei 我的解决方案是放弃尝试在单独的 .xib 文件中执行此操作,而是通过将 UIView 拖到表视图上将其作为表视图标题添加到情节提要中。跨度>
【参考方案1】:
试试这个,
[button sendActionsForControlEvents:UIControlEventTouchUpInside];
如果这正确调用了您的目标/选择器,那么问题出在您的视图层次结构上。如果不是,那么问题是您没有正确编码按钮的目标/选择器。
【讨论】:
这行得通。它必须与视图层次结构有关。任何指示要检查什么?一切似乎都井然有序。 请看我的更新。我发现了视图层次结构出了什么问题,但现在我需要弄清楚是什么原因造成的。 可能你对tableHeaderView 和section header view 感到困惑。我尝试了同样的方法,并且我清楚地能够在按钮单击期间调用按钮操作。见链接developer.apple.com/library/ios/documentation/UIKit/Reference/…。发布您的代码,以便我们轻松调试。【参考方案2】:也许您可以将按钮背景颜色设置为红色或其他颜色。您可以编写此“self bringSubviewToFront:xx”,这意味着您将按钮设置为 topView。
【讨论】:
我会尝试调用bringToFront,但我怀疑这是否可行,因为根本没有重叠的视图。 你可以写'xx.clipsToBouds = yes;",xx是你的子视图。以上是关于UITableView tableHeaderView中的UIButton没有响应触摸的主要内容,如果未能解决你的问题,请参考以下文章
iOS:如何在导航栏中与 NavigationBar Title 平行放置一个按钮?