UITableViewCell中的按钮在ios 7下无响应

Xav*_*ier 50 uibutton uitableview ios ios7

我有一个tableview,每个单元格包含一个按钮.它在所有iOS版本中运行良好,但是7.我不知道发生了什么.单元格在一个xib文件中构建.

有人能给我一些建议吗?提前致谢.

b00*_*t3r 69

对我有用的是:

contentView.userInteractionEnabled = NO;
Run Code Online (Sandbox Code Playgroud)

从nib加载我的自定义单元格后调用.看起来在创建nib文件中定义的视图后,会创建此内容视图并将其设置为顶级子视图.

  • 如果你在Xcode 5之前创建了自定义UITableViewCell,这是有效的,因为contentView是iOS 7的新功能.如果你的单元格是"旧样式",则contentView会遮挡它,这就是为什么它适用于这些情况.对于我们这些已经将我们的按钮作为contentView子视图的人来说,这不起作用,并且解决方案的旅程仍在继续. (15认同)

yon*_*nix 32

[cell bringSubviewToFront:button]从笔尖加载单元格后调用解决了这个问题.

  • 它对我不起作用.按钮已经在"最前沿" (4认同)
  • 其工作原因是iOS 7引入了一个响应单元格触摸的中间`contentView`子视图.如果此视图超出您的按钮,它将接收触摸而不是按钮.`bringSubviewToFront`确保您的按钮位于视图堆栈的顶部. (3认同)

us_*_*vid 27

我也在努力解决这个问题,我对stackoverflow和internet上的不同答案进行了大量研究,解决方案根据问题的根源而有所不同.对于大多数情况,您需要使用应该采取用户操作的元素(点击/单击等)执行以下操作:
myButton.userInteractionEnabled = YES;

特别是对于UILabel/UIImageView,默认情况下userInteractionEnabled标志为NO.

如果要从xib加载视图,则需要确保从自定义单元视图,内容视图以及要启用用户操作的元素,都选中了复选框:
在此输入图像描述

在上面的示例中,DeviceViewCell,Content ViewButton元素都选中了" User Interaction Enabled "复选框.
如果将自定义单元格实现为UITableViewCell的子类,并且动态地从另一个xib文件加载自定义单元格视图,那么您还需要做一件让大多数人感到困惑的事情,但我将
在后面解释原因:In自定义单元格的初始化方法,您需要执行以下操作:
self.contentView.userInteractionEnabled = NO

self您创建的UITableViewCell的子类在哪里.同样,如果自定义单元格被实现为UITableViewCell的子类,并且自定义单元格视图从另一个xib文件动态加载,则需要执行上述操作.这是解释:

self.contentViewContent View您在Interface Builder中看到的不同,它是由系统创建的,它位于default content view自定义单元格视图中每个其他视图/元素的TOP上,并且它模糊了视图层次结构中的其余视图.因此,在自定义单元视图中的UI元素可以接收用户交互事件之前,您需要为其禁用用户交互.希望这可以帮助.如果您有更好的解释,我很乐意听到:-).再次是我的观察,可能还有其他原因.欢迎讨论!


dul*_*gan 6

问题是你的nib不包含contentView,因为iOS 8 SDK需要(我是根据经验写的,没有可行的来源,对不起).

当您添加UITableViewController到故事板时,会UITableView自动添加UITableViewCell .如果你看看这个UITableView,你会看到contentView它.

因此,当您子类化UITableViewCell并使用.xib创建它时,您必须单击并拖动UITableViewCell到xib而不是默认值UIView.然后不要忘记将File Owner类和UITableViewCell类设置为您的子类.


小智 5

这个问题的解决方法是;

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {    
cell.bringSubviewToFront(cell.YOUR_UIView)    
}
Run Code Online (Sandbox Code Playgroud)

这对我有用。