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 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
作为参数。然后按钮应该响应。
有许多 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
。
我在 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 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
作为参数。然后按钮应该响应。
有许多 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
。