按钮在表视图单元格中没有响应

时间:2015-10-09 23:02:13

标签: ios objective-c button tableview

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

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

如何解决此问题?有没有办法将背景视图移动到视图的背面,以便按钮响应?

调试视图层次结构:
enter image description here

.xib的结构 enter image description here

7 个答案:

答案 0 :(得分:1)

你可以检查的两件事

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

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

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

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

答案 1 :(得分:1)

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

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

由于您的观看次数已插入超级视图,因此您可以按照自己喜欢的顺序轻松地为每个观看一次exchangeSubviewAtIndex:withSubviewAtIndex:sendSubviewToBack

答案 2 :(得分:0)

也许您忘了将按钮分配给代码

答案 3 :(得分:0)

我认为Feed CellUITableViewCell的子类,cellBackgroundView是此单元格的属性contentView。 如果是这样,则单元格属性backgroundView应位于cellBackgroundView后面(docs说:UITableViewCell将背景视图添加为所有其他视图后面的子视图并使用其当前帧位置)。
您可以设置单元格属性backgroundView = nil,并查看它是否仍在视图层次结构中。如果是这样,您确实在某处的其他单元格视图之上添加了自定义backgroundView 要检查这一点,您可以在方法tableView:cellForRowAtIndexPath:中读取单元格的子视图层次结构,其中包含NSArray *svs = cell.subviews;(假设celltableViewCell)并设置后面的断点这句话 svs通常首先包含UITableViewCellContentView,在_UITableViewCellSeparatorView之上。单元格backGroundView将不会显示。您可以检查您的视图层次结构 如果偶然存在自定义backgroundView,您可以 - 作为解决方法,而不是解决方案 - 通过contentViewbringSubviewToFront:发送contentView var eventH = ""; if ('ontouchstart' in document.documentElement) eventH = "touchend"; else eventH = "click"; // Just taking care of exceptions. if (eventH != "") $('#myBtn').on(eventH, function(e) { // Some code }); 1}}作为参数。然后按钮应该响应。

答案 4 :(得分:0)

在你的Xib结构中将你的按钮放在视图下方,首先将视图添加到superView然后按钮,然后按钮就可以了。

或者您可以编码

-(void)viewDidLayoutSubviews{

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

}

希望它会有所帮助。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

你可以使用这种方法。

[cell.contentView  bringSubviewToFront:yourButton];

之后,如果你想在后台返回,那么tou可以使用sendSubviewToBack:方法。

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