【问题标题】:Button not working in UITableViewCell subclass when it is a subview of a view inside the UITableViewCell当它是 UITableViewCell 内视图的子视图时,按钮在 UITableViewCell 子类中不起作用
【发布时间】:2012-02-14 05:40:41
【问题描述】:

我在 tableView 单元中有一个按钮,我需要响应触摸事件。通常这很容易解决

    [cell.playButton addTarget:self action:@selector(playButtonPressed:) forControlEvents:UIControlEventTouchUpInside];

-tableView:cellForRowAtIndexPath: 内部

我遇到的问题是我的按钮位于自定义 UITableViewCell 子类中,并且也是我在该类中创建的视图的子视图..

例如:

    UIView *view = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
    self.theView = view;
    [self addSubview:view];
    [view release];


    UIButton *playButton = [UIButton buttonWithType:UIButtonTypeCustom];
    playButton.frame = CGRectMake(5, 5, 100, 30);
    [playButton setImage:[UIImage imageNamed:@"button_playvid.png"] forState:UIControlStateNormal];
    [playButton setImage:[UIImage imageNamed:@"button_playvid_active.png"] forState:UIControlStateHighlighted];
    self.playButton = playButton;
    [self.theView addSubview:playButton];

当按钮是我在自定义 UITableViewCell 中创建的视图的子视图时,单元格会突出显示,而不是按下按钮,因此我在 -tableView:cellForRowAtIndexPath 中设置的目标永远不会被调用。不知道为什么..有什么帮助吗?

谢谢,

乔尔

PS。我意识到创建一个完全像这样的背景视图可能没有实际的理由,因为已经有一个。这只是我用来解释我遇到的问题的示例代码..:D

感谢您的关注!

【问题讨论】:

  • 使用“playButtonPressed:”方法实现编辑您的问题。
  • 您是说您在视图控制器中创建一个 UIButton 并将其添加为视图控制器视图的子视图和 uitableview 的单元格(也添加到同一视图控制器的视图)??这不是个好主意...
  • 将按钮添加到新的 [view addSubview:playButton]
  • playButtonPressed: 只是一个 NSLog() 语句,告诉我该代码是否被调用。问题是它没有,所以 playButtonPressed: 实现是否正确并不重要?

标签: objective-c cocoa-touch uiview uitableview


【解决方案1】:

您添加的 UIView 实际上是一个 UIImageView。来自文档:

默认情况下,新的图像视图对象配置为忽略用户事件。如果要在 UIImageView 的自定义子类中处理事件,则必须在初始化对象后将 userInteractionEnabled 属性的值显式更改为 YES。

我认为在这种情况下,userInteractionEnabled 级联到子视图或超级视图不会将触摸传递给其子视图,因此您的按钮将不会收到触摸。将您的图像视图设置为.userInteractionEnabled = YES,您应该没问题。

【讨论】:

  • 有效!!谢谢你的帮助!!很高兴我在创建示例代码时不小心将它保留为 UIImageView 哈哈。
  • 没问题。顺便说一句,这是一个完美的问题 - 清晰的例子,易于复制,所有信息都存在,自包含 - 继续!
【解决方案2】:

我遇到了同样的问题并尝试了所有方法。最终实现的是方法

(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

只需返回自定义单元格的高度(查看 NIB 文件)

【讨论】:

  • 感谢您发布此提示。我遇到了同样的问题,并且检查了所有视图 userInteractionEnabled 属性设置正确的次数比我想承认的要多。结果我已经覆盖了tableView:heightForRowAtIndexPath:,并且由于某种未知原因返回了 0。
【解决方案3】:

您可以尝试使用图片来代替按钮。您可以定义单击图像时要调用的方法。

【讨论】:

    【解决方案4】:

    最近我遇到了遗留代码的此类问题。原因是之前我们习惯将子视图添加到自定义UITableViewCell 实例本身,现在我们必须添加到单元实例的contentView

    我通过更改来修复它:

    addSubview(increaseButton)
    

    contentView.addSubview(increaseButton)
    

    当然,isUserInteractionEnabled 应该是true

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-19
      相关资源
      最近更新 更多