我在表视图中使用.xib作为我的单元格。在.xib中,是另一个视图(cellBackgroundView)和一个按钮。当我运行应用程序并单击按钮时,它根本不响应。相反,它调用tableView的didSelectedRowAtIndexPath方法,该方法带来另一个视图控制器。
使用Xcode的Debug View Hierarchy,我发现我有一个覆盖所有按钮的视图(见附图:这个重叠的视图突出显示)。覆盖我的按钮的这个视图(称为backgroundView)是一个View,在视图中。我有一种感觉,当您在视图中放置视图,并在初始视图中放置一个按钮时,不会调用该按钮,因为它在视图层次结构下方。
如何解决此问题?有没有办法将背景视图移动到视图的背面,以便按钮响应?
答案 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 Cell
是UITableViewCell
的子类,cellBackgroundView
是此单元格的属性contentView
。
如果是这样,则单元格属性backgroundView
应位于cellBackgroundView
后面(docs说:UITableViewCell
将背景视图添加为所有其他视图后面的子视图并使用其当前帧位置)。
您可以设置单元格属性backgroundView = nil
,并查看它是否仍在视图层次结构中。如果是这样,您确实在某处的其他单元格视图之上添加了自定义backgroundView
要检查这一点,您可以在方法tableView:cellForRowAtIndexPath:
中读取单元格的子视图层次结构,其中包含NSArray *svs = cell.subviews;
(假设cell
为tableViewCell
)并设置后面的断点这句话
svs
通常首先包含UITableViewCellContentView
,在_UITableViewCellSeparatorView
之上。单元格backGroundView
将不会显示。您可以检查您的视图层次结构
如果偶然存在自定义backgroundView
,您可以 - 作为解决方法,而不是解决方案 - 通过contentView
向bringSubviewToFront:
发送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
。