Table View Cell 中的按钮没有响应

Button not responding in Table View Cell

我在 table 视图中为我的单元格使用 .xib。在 .xib 中,是另一个视图 (cellBackgroundView) 和一个按钮。当我 运行 应用程序并单击按钮时,它根本没有响应。相反,它调用 tableView 的 didSelectedRowAtIndexPath 方法,该方法带来另一个视图控制器。

使用 Xcode 的调试视图层次结构,我发现我有一个覆盖所有按钮的视图(见附图:这个覆盖视图被突出显示)。覆盖我的按钮的这个视图(称为 backgroundView)是一个视图,在一个视图中。当您在视图中放置一个视图并在初始视图中放置一个按钮时,我有一种感觉,该按钮不会被调用,因为它位于视图层次结构之下。

如何解决这个问题?有没有办法将背景视图移动到视图层次结构的后面,以便按钮响应?

调试视图层次结构:

.xib 的结构

您可以检查两件事

1) 你有单元格高度的委托方法吗?返回的高度是否正确?除非您为 UITableViewCell 打开 Clip Subviews,否则单元格的内容在其框架外可见,但单元格框架外的部分不会注册用户交互。

2) 是否有其他视图元素在层次结构中处于较高位置(在您发布的 XCode 列表中处于较低位置)与按钮重叠? iOS 模拟器 Debug -> Color Blended Layers 可以帮助发现这一点。

编辑: 如果我正确解释了添加的屏幕截图,则您可能遇到了上面选项 1) 中提到的问题。如果屏幕截图中显示的其他元素是那些列为 Cell Background View 的子视图的元素,它们大部分位于父视图的框架之外,因此不会接收触摸事件。如果背景视图的框架是正确的,那么您可能希望将其他元素作为 Feed Cell 的子元素直接移动。

此外,元素列表表明您正在使用纯 UIView 作为父元素。我不知道您的应用程序的内部工作原理,但如果您仅在 UITableViewCell 中使用此视图,您可能需要考虑在 xib 中将父视图设为 Table View Cell。这将减少一些膨胀并允许您为 xib 中的单元格配置一些属性。

也许您忘记了将 Button 分配给代码

我假设 Feed CellUITableViewCell 的子类,而 cellBackgroundView 是该单元格的 属性 contentView
如果是这样,单元格 属性 backgroundView 应该在你的 cellBackgroundView 后面(docs 说:UITableViewCell 将背景视图添加为所有其他视图后面的子视图,并且使用其当前帧位置。)。
您可以设置单元格 属性 backgroundView = nil,然后查看它是否仍然存在于视图层次结构中。如果是这样,您确实会在某处的其他单元格视图之上添加一个自定义 backgroundView
要检查这一点,您可以在方法 tableView:cellForRowAtIndexPath: 中使用 NSArray *svs = cell.subviews; 之类的内容读出单元格的子视图层次结构(假设 celltableViewCell)并在后面设置一个断点这个声明。
svs 通常首先包含 UITableViewCellContentView,然后是 _UITableViewCellSeparatorView。单元格 backGroundView 将不会显示。您可以在那里检查您的视图层次结构。
如果偶然在顶部有一个自定义 backgroundView,您可以 - 作为一种解决方法,而不是解决方案 - 通过将 contentView 发送到单元格 bringSubviewToFront:contentView 作为参数。然后按钮应该响应。

有许多 UIView 方法可以让您修改视图层次结构。

bringSubviewToFront:
sendSubviewToBack:
insertSubview:atIndex:
insertSubview:aboveSubview:
insertSubview:belowSubview:
exchangeSubviewAtIndex:withSubviewAtIndex:

由于您的视图已经插入到您的父视图中,您可以轻松地为每个视图以您喜欢的顺序调用一次 exchangeSubviewAtIndex:withSubviewAtIndex:sendSubviewToBack

在您的 Xib 结构中,将您的按钮放在视图下方,首先将视图添加到 superView,然后添加按钮,然后您的按钮将起作用。

或者你可以编码

-(void)viewDidLayoutSubviews{

[self.view insertSubview:yourButton aboveSubview:cellBackgroundView];

}

希望对您有所帮助。

您是否通过代码添加 UIButton
如果是这样,您应该确保 addSubview: 进入 cell.contentView 而不是 cell.

您也可以尝试将 CellBackground class 应用于 contentView 内的视图,而不是直接应用于 contentView.

你可以用这个方法。

[cell.contentView  bringSubviewToFront:yourButton];

之后,如果您想返回后台,则可以使用 sendSubviewToBack: 方法。

添加此方法后,您的按钮没有响应设置按钮超级视图的 userIntractionEable