自定义 UITableViewCell 中的按钮在 iOS 7 中没有响应

Posted

技术标签:

【中文标题】自定义 UITableViewCell 中的按钮在 iOS 7 中没有响应【英文标题】:Button in custom UITableViewCell not responding in iOS 7 【发布时间】:2014-07-31 04:27:53 【问题描述】:

这或多或少是这篇文章的延续:Button in UITableViewCell not responding under ios 7

我遇到了同样的问题,并且已经尝试了线程中的每一个建议。显然我不拥有该问题,因此我无法对其进行编辑以提供更多信息,因此我现在发布此问题!

问题:

我有一个加载的 VC 笔尖,其中有一个表格视图,我根据其中的行数调整大小。每一行都由使用 nib 文件的自定义 uitableviewcell 子类组成。该类/笔尖中有 4 个按钮。我现在可以在 iOS 6 或 iOS 8 中加载这段代码,它运行良好。我没有 iOS 7 设备,所以我绑定到 7.1 的模拟器(这是我猜报告此问题的用户今天也在使用的版本)。现在在模拟器和用户的手机中,我可以触摸/单击该 VC 上的所有其他内容,除了单元格中的任何按钮。就好像他们将 UserInteractionEnabled 设置为 NO,但他们没有,也没有任何父视图(我将很快介绍)。

尝试过的解决方案:

-使用和不使用自动布局从头开始完全重新创建笔尖

-在cell类的awakeFromNib中调用[self.contentView addSubview:button]

-尝试在运行时使用[self.contentView addSubView:button] 将按钮重新添加到contentView

- 确保我能找到的层次结构中的每个视图导致这些按钮都将userInteractionEnabled 设置为YES 的四倍。 (包括但不限于 tableview 本身、单元格、contentView 以及当我向设置的按钮添加“父视图”时)

-尝试使用只包含按钮的父视图提升所有按钮

-所有按钮都在事件堆栈的顶部(视觉底部)(添加和删除是另外两个按钮):

-已将表格单元格选择从单个设置为无。

-我没有在我的单元格类中覆盖 layoutSubviews

-如果我这样做,我无法将任何视图移出内容视图,因为 Interface Builder 会将它们完全移出单元格。

-我尝试在运行时仅在 ContentView 上禁用 userInteractionEnabled 而没有任何变化

-我尝试将不同按钮的 tableview [cell bringSubviewToFront:cell.button]; 的单元格创建代码放入相同的结果。

希望有帮助的事实:

-我尝试将层次结构中所有视图的所有背景颜色设置为不同的颜色,这样我就可以在运行时直观地对其进行调试......它看起来完全符合预期。没有重叠或覆盖。 (这仅限于单元格中的视图)

-这是 TableView 的所有设置:

-我试图在新的 XCode 6 中加载它以使用可视化调试器,但它附带的 7.1 模拟器实际上完美地运行了代码,因此我可以调试它...

-这是VC中的出队代码:

NiTGroupTimeCell* cell = (NiTGroupTimeCell*)[tableView dequeueReusableCellWithIdentifier:ident forIndexPath:indexPath];

-这是VC的viewDidLoad中的代码,用于设置带有表格的单元格笔尖(它是2,因为这是从头开始的):

[self.timesTable registerNib:[UINib nibWithNibName:@"NiTGroupTimeCell2" bundle:nil]  forCellReuseIdentifier:@"GroupTime"];

-所有连接都是通过 IB 建立的。这些都在使用 IBAction 或 IBOutlet。

-我在所有按钮方法中都有NSLog 语句来测试它们是否被实际调用,但我也使用断点进行了测试。所有都不会在测试中触发。

-唯一实现的TableView委托或数据源方法如下:

-(int)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

-根据建议,我带 Revel 去看,发现一个谜 UILabelUIImageView 在视图中....但是你可以看到他们的框架都是零,所以他们不应该进入恐怕会回到我们原来的位置:

UILabel 框架:

UIImageView 框架:

IIRC 我之前将此视为模拟器错误,但由于它发生在用户的设备上,因此它一定是一个实际问题,并且它阻碍了我的管道,因此非常感谢您的帮助!提前致谢!

PS 我很乐意发布任何内容,但是由于调试的所有变化,我不知道人们会想看到什么,我不想让这篇文章超载,因为我知道它会是长与其他一切。

【问题讨论】:

这个视图上是否有任何 uitouchgesturerecognizers? 意识到这是很小的一点,但你永远不知道......你不需要在 dequeueReusableCellWithIdeintifier 时强制转换 NiTGroupTimeCell,因为它会在不这样做的情况下返回单元格 OK (NiTGroupTimeCell*) 罗马:不,没有 UITouchGestureRecognizers。 Jeely:很高兴知道,谢谢^^ 你能贴出捕捉 UIButton 动作的代码吗? UIButton 是拖到 xib 上的,还是您以编程方式制作的? ....最后一个愚蠢的问题 - 您使用的模拟器是 3.5 英寸还是 4 英寸屏幕? 【参考方案1】:

显然问题在于这些代码行(我的 git diff 输出中的 diff 格式):

--(int)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
+-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

--(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
+-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

所以是的...似乎在 iOS7+ 中,如果您有这些数据源方法的“旧”输出类型,它看起来会很好,但会在功能上破坏您的 tableview...好时光,但是现在已经修复了^^ 希望这个帮助他人。

【讨论】:

哇?!?你是说仅仅改变那些 UITableViewDataSource 方法的返回值就解决了? 我也不敢相信......但我在测试它时相当有条理,所以我很肯定这就是解决方案。我通过查看编译警告找到了它(我知道我应该总是这样做,但是当它们往往是“循环块”和“转换为较低精度”警告的垃圾邮件时很难)它警告它如何可能找到要覆盖的方法,然后说,例如“(NSInteger)vs.(int)”返回或类似的东西。不认为它会有多大帮助,但没有看到它会伤害到哪里,所以我还是尝试了它并tada。再次感谢您的帮助!^^【参考方案2】:

我怀疑您的自定义 UITableViewCell 子类 NiTGroupTimeCell 或从 nib 到 tableViewCell 子类的 IBAction 连接存在问题。 我也想知道额外的空 UILabel 和 UIImageView。它们听起来像是在 UITableViewCell.h、UIImageView *imageViewUILabel *textLabel 中声明的默认属性。它们被实例化(并且不是 nil)这一事实可能是您所看到的奇怪、意外行为的线索。 你有 UIButtons 的 IBOutlets 吗?如何更改按钮的属性(在代码中)(例如背景颜色)以确保您实际上将它们保留在 NiTGroupTimeCell 中。

【讨论】:

我有IBOutlets 用于所有 4 并将所有的背景颜色设置为黑色,并在运行时全部反映。是否有其他测试可以为我们提供更多信息? 单元格中是否还有其他元素是触摸目标? UITableViewCell 是否突出显示和/或允许通过诸如- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 之类的委托方法进行选择? 不,不。只需 4 个按钮。 用一个简单的 NSLog() 实现我提到的 UITableView 委托方法怎么样? 有趣..我将桌子上的选择从“无”更改为“单一”并实现了-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath,但它也从未触发过..所以我尝试了-(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath,所以看看它是否得到了在那里,但这也不会触发......双重和三重检查显示以验证没有任何视图覆盖它。还要确保将代表放在桌子上。正如您在上面看到的那样,userInteractionEnabled 已开启……我输了。【参考方案3】:

您是说您尝试了 [self.contentView addSubview:button] 但您的第一张图片中的按钮位于 contentView 内的视图中。尝试将 IBOutlet 链接到该视图,然后尝试 [nameOfView addSubview];

【讨论】:

那是在我添加该视图之前。那只是测试另一个问题的答案。【参考方案4】:

大胆猜测,因为您似乎已经涵盖了几乎所有其他内容。

你说:

我加载了其中有一个表格视图,我根据其中的行数调整大小

您发布了一个屏幕截图,显示clip subviewsUITableView 上已关闭

您是否错误地设置了 tableview 的框架,但由于子视图没有被裁剪,它仍然显示单元格?

再次加载reveal并检查UITableView的高度

【讨论】:

非常好的想法,但UITableView 的高度不是单行的 45,因为它应该是。另外,只是为了确保我打开了Clip Subviews 以确保它是否弹出它会很明显。感谢您的尝试!^^ 老兄,App Store 里有这个应用吗,介意发个链接吗? 长话短说,不,它还没有在应用商店。^^;当我们发现这个“边缘案例”时,我们正要交出它。【参考方案5】:

不确定是不是这里的情况。但是,如果您将自定义单元出口命名为 imageViewtextLabel 或任何“内置”UITableViewCell 的属性,您将得到奇怪的结果和行为。

【讨论】:

所有网点都有唯一且非标准的名称,但感谢您的洞察力!【参考方案6】:

你需要检查几件事:

    确保按钮的所有父视图都启用了User Interaction。 在尺寸检查器中检查AutoSizing 并确保按钮位于视图内,以便它可以接收触摸事件,否则触摸事件将被忽略。您可以通过更改视图的颜色来验证它。更改颜色或NSLog 按钮和父视图的框架将帮助您解决问题。 如果从 IB 进行设计,请尽量让事情变得更简单,不要以编程方式 addSubView。 确保某些组件没有与带有clearColor 背景颜色的按钮重叠。

【讨论】:

1.全部已检查 2. 我已通过着色和显示应用程序验证它既可见又不覆盖。 3. 我想我在原帖中没有说清楚,但即使我尝试了机器人addSubviewbringViewToFront,当前版本也纯粹使用 IB。 4. 2中回答【参考方案7】:

对我有用的是:

self.contentView.userInteractionEnabled = NO;

我在从 nib / storyboard 加载我的自定义单元格后调用了它。如果没有将 userinteractionEnabled 设置为 NO,我的按钮不会以某种方式响应触摸。我的contentView 已收到所有触摸,但没有将它们转发到我的按钮。

我看过代码在哪里

[cell bringSubviewToFront:button]

已被用作解决方法,对我来说它并没有解决问题。

【讨论】:

【参考方案8】:

我在添加基于访客的自定义操作时遇到了类似的问题。

我在 UITableViewCell 的继承类中添加了运行时的操作按钮 行为是如果我在可见矩形之外添加按钮,在内部设置动画按钮后,我无法单击/点击。但在我的情况下,如果在可见矩形中添加了按钮,我可以点击/单击。

什么对我有用,我在 View 中添加了这些按钮,而不是 UITableViewCell 的 ContentView,然后仅动画内容视图。你可以试试类似的东西

-- 维沙尔

【讨论】:

【参考方案9】:

您说过没有 TouchRecognizers(TapRecognizers?),但我认为您应该仔细检查,不仅要查找触摸识别器,还要查找控制器中使用该单元格的任何识别器,甚至添加到 self.视图/表视图。 我最近试图找出为什么单元格不选择(未调用委托方法)只是发现我添加了 2 个手势识别器(在代码中,这些是其他事情所必需的,但我必须这样做以其他方式),这将阻止单元格选择。

另外的迹象可能是,如果您按住按钮足够长的时间(在此处放置断点以便您可以更轻松地进行操作),动作将会触发。

【讨论】:

以上是关于自定义 UITableViewCell 中的按钮在 iOS 7 中没有响应的主要内容,如果未能解决你的问题,请参考以下文章

用作自定义 UITableViewCell 的 XIB 中的自定义按钮不响应点击(ios7)

自定义 UITableViewCell 中的 UIButton 导致在多个单元格中选择按钮

自定义 UITableViewCell 中的操作按钮调用的 UITableView reloadRows() 总是落后一步

自定义 UITableViewCell 中的 UIButton 在旋转后停止工作

自定义 UITableViewCell 中的按钮在 iOS 7 中没有响应

如何得到自定义UITableViewCell中的按钮所在的cell的indexPath.row