自定义UITableViewCell中的按钮在iOS 7中无响应

时间:2014-07-31 04:27:53

标签: ios objective-c uitableview

这或多或少是这篇文章的延续:Button in UITableViewCell not responding under ios 7

我遇到了同样的问题,并尝试了线程中的每个建议。显然我不拥有这个问题所以我不能编辑它以提供更多信息,因此我现在为什么要发布这个问题!

问题:

我有一个VC nib我加载了有一个tableview,我根据其中的行数调整大小。每行都是使用nib文件从自定义的uitableviewcell子类生成的。那个类/笔尖里面有4个按钮。我现在可以在iOS 6或iOS 8中加载此代码,它可以完美地运行。我没有iOS 7设备所以我被绑定到7.1的模拟器(这是我猜的用户报告此问题的用户也是如此,因为它是今天)。现在在模拟器和用户的手机中,我可以触摸/单击该VC上的所有其他内容,除了单元格中的任何按钮。好像他们将UserInteractionEnabled设置为NO,但他们没有,也没有任何父视图(因为我很快就会进入)。

尝试过的解决方案:

- 使用和不使用自动布局

从头开始重新创建笔尖

在单元格类的[self.contentView addSubview:button]中调用awakeFromNib

- 在运行时使用contentView

重新添加按钮到[self.contentView addSubView:button]

- 确保我可以找到的层次结构中的每个视图都有四次,导致这些按钮的userInteractionEnabled设置为YES。 (包括但不限于tableview本身,单元格,contentView以及当我向其设置的按钮添加“父视图”时)

- 用父视图提升所有按钮,只包含按钮

- 所有按钮位于事件堆栈的顶部(视觉底部)(添加和删除是另外两个按钮): Hierarchy List

- 将表格单元格选择从单个设置为无。

- 我没有覆盖我的手机课程中的layoutSubviews

- 我无法移动内容视图之外的任何视图,因为如果我这样做,Interface Builder会将它们完全从单元格中移出。

- 我尝试在运行时仅在userInteractionEnabled上禁用ContentView而没有更改

- 我尝试将tableview [cell bringSubviewToFront:cell.button];的单元格创建代码放入相同结果的不同按钮中。

希望有用的事实:

- 我尝试将层次结构中所有视图的所有背景颜色设置为不同颜色,这样我就可以在运行时直观地调试它......它看起来与预期完全一样。没有重叠或覆盖物。 (这仅限于单元格中的视图)

- 这是TableView的所有设置: TableView SS 1 TableView SS 2

- 我试图在新的XCode 6中加载它以使用可视化调试器,但它附带的7.1模拟器实际上完全运行了代码,所以我可以调试它......

- 这是VC中的出队代码:

NiTGroupTimeCell* cell = (NiTGroupTimeCell*)[tableView dequeueReusableCellWithIdentifier:ident forIndexPath:indexPath];

-Here是VC的viewDidLoad中的代码,用于设置表格的单元格nib(它是2,因为这是从头开始的):

[self.timesTable registerNib:[UINib nibWithNibName:@"NiTGroupTimeCell2" bundle:nil]  forCellReuseIdentifier:@"GroupTime"];

- 通过IB进行所有连接。这些都是使用IBAction或IBOutlet。

- 我在所有按钮方法中都有NSLog个语句来测试它们是否实际被调用,但我还测试了断点。所有这些都不会在测试中触发。

- 实现的唯一TableView委托或数据源方法如下:

-(int)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

- 根据建议,我把Revel带到了它,发现视图中有一个神秘的UILabelUIImageView ......但是你可以看到它们的帧都是零,所以它们不应该'这样做会妨碍我们害怕的事情:

Layers

Hierarchy List from Revel

UILabel框架: UILabel frame

UIImageView框架: UIImageView frame

IIRC我之前把它当作模拟器错误计算过,但是由于它发生在用户的设备上,它必定是一个实际的问题而且它正在阻止我的管道,所以非常感谢帮助!提前致谢!

PS我很乐意发布任何内容,但由于调试的所有转变,我不知道人们想要看到什么,我不想超载这篇文章,因为我知道它会是与其他一切有关。

9 个答案:

答案 0 :(得分:3)

显然问题是这些代码行(来自我的git diff输出的diff格式):

--(int)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
+-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

--(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
+-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

所以是的......似乎在iOS7 +中如果你有#34; old"这些数据源方法的输出类型看起来不错,但是在功能上对你的tableview很麻烦...很好的时候,但是它现在已经解决了^^希望这对其他人有帮助。

答案 1 :(得分:1)

我怀疑您的自定义UITableViewCell子类NiTGroupTimeCell或者从nib到tableViewCell子类的IBAction连接存在问题。
我也想知道额外的空UILabel和UIImageView。它们听起来像在UITableViewCell.h,UIImageView *imageViewUILabel *textLabel中声明的默认属性。事实上,他们已经实例化(并且没有),这可能是您所看到的奇怪,意外行为的线索。
你有UIButtons的IBOutlets吗?如何更改按钮的属性(代码中)(例如背景颜色),以确保实际将它们保留在NiTGroupTimeCell中。

答案 2 :(得分:0)

您说您尝试了[self.contentView addSubview:button],但第一张图片中的按钮位于contentView内的视图中。尝试将IBOutlet链接到该视图,然后尝试[nameOfView addSubview];

答案 3 :(得分:0)

投掷一个狂野的猜测,因为它看起来已经覆盖了其他所有东西。

你说:

  

我加载了一个包含tableview的表格,我根据其中的行数调整大小

您发布的屏幕截图显示clip subviews

上的UITableView已关闭

您是否正确设置了tableview的框架,但由于子视图未被剪裁而无法显示单元格?

再次加载reveal并检查UITableView

的高度

答案 4 :(得分:0)

不确定这是否是这种情况。但是,如果您将自定义单元格出口imageViewtextLabel或任何“内置”UITableViewCell的属性命名,您将获得奇怪的结果和行为。

答案 5 :(得分:0)

你需要检查几件事情:

  1. 确保按钮的所有父视图都已启用User Interaction
  2. 检查尺寸检查器中的AutoSizing并确保按钮位于视图内部,以便接收触摸事件,否则触摸事件将被忽略。您可以通过更改视图的颜色来验证它。如果出现问题,更改颜色或NSLog按钮和父视图的框架将有助于您排除故障。
  3. 如果从IB设计,​​请尝试使事情变得更简单,并且不要addSubView以编程方式进行。{/ li>
  4. 确保某些组件没有与clearColor背景色的按钮重叠。

答案 6 :(得分:0)

对我有用的是:

self.contentView.userInteractionEnabled = NO;

我从nib / storyboard加载自定义单元格后调用了这个。如果userinteractionEnabled设置为NO,我的按钮无法以某种方式响应触摸。我的contentView已收到所有触摸,但没有将它们转发到我的按钮。

我看过代码

[cell bringSubviewToFront:button]

已被用作解决方法,对我来说它没有解决问题。

答案 7 :(得分:0)

我有一个类似的问题,同时添加了基于Guestures的Custom Acions。

我在继承类UITableViewCell中在运行时添加了Action Button 如果我在可见矩形之外添加按钮,在内部设置动画按钮后,我就无法点击/点击。但是在My Case中,如果按钮被添加到可见的矩形中,我就可以点击/点击。

为我工作的是什么,我在View而不是ContentView的UITableViewCell中添加了这些按钮,然后仅设置动画内容视图。你可以尝试一下simora

- 维沙尔

答案 8 :(得分:0)

您已经说过没有TouchRecognizers(TapRecognizers?),但我认为您应该仔细检查一下,不仅要看触摸识别器,还要看控制器中使用该单元的任何识别器,甚至添加到self.view /的tableView。 我最近试图找出为什么细胞不选择(委托方法没有被调用)只是为了发现我已经添加了2个手势识别器(在代码中,那些是其他东西必需的,但我必须以其他方式这样做才能阻止细胞选择。

另外,它的标志可能是如果你按住按钮足够长(在那里放置断点以便你可以更容易),动作将会触发。