自定义 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 去看,发现一个谜 UILabel
和 UIImageView
在视图中....但是你可以看到他们的框架都是零,所以他们不应该进入恐怕会回到我们原来的位置:
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 *imageView
和 UILabel *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 subviews
在UITableView
上已关闭
您是否错误地设置了 tableview 的框架,但由于子视图没有被裁剪,它仍然显示单元格?
再次加载reveal
并检查UITableView
的高度
【讨论】:
非常好的想法,但UITableView
的高度不是单行的 45,因为它应该是。另外,只是为了确保我打开了Clip Subviews
以确保它是否弹出它会很明显。感谢您的尝试!^^
老兄,App Store 里有这个应用吗,介意发个链接吗?
长话短说,不,它还没有在应用商店。^^;当我们发现这个“边缘案例”时,我们正要交出它。【参考方案5】:
不确定是不是这里的情况。但是,如果您将自定义单元出口命名为 imageView
、textLabel
或任何“内置”UITableViewCell
的属性,您将得到奇怪的结果和行为。
【讨论】:
所有网点都有唯一且非标准的名称,但感谢您的洞察力!【参考方案6】:你需要检查几件事:
-
确保按钮的所有父视图都启用了
User Interaction
。
在尺寸检查器中检查AutoSizing
并确保按钮位于视图内,以便它可以接收触摸事件,否则触摸事件将被忽略。您可以通过更改视图的颜色来验证它。更改颜色或NSLog
按钮和父视图的框架将帮助您解决问题。
如果从 IB 进行设计,请尽量让事情变得更简单,不要以编程方式 addSubView
。
确保某些组件没有与带有clearColor
背景颜色的按钮重叠。
【讨论】:
1.全部已检查 2. 我已通过着色和显示应用程序验证它既可见又不覆盖。 3. 我想我在原帖中没有说清楚,但即使我尝试了机器人addSubview
和bringViewToFront
,当前版本也纯粹使用 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 在旋转后停止工作