50

我有一个表格视图,每个单元格包含一个按钮。除了 7 之外,所有 iOS 版本都运行良好。我不知道发生了什么。该单元在一个 xib 文件中构建。

谁能给我一些建议?提前致谢。

4

24 回答 24

70

对我有用的是:

contentView.userInteractionEnabled = NO;

从笔尖加载我的自定义单元格后调用。在创建 nib 文件中定义的视图后,该内容视图似乎已创建并设置为顶级子视图。

于 2013-10-04T16:07:17.057 回答
32

Calling [cell bringSubviewToFront:button] after loading the cell from nib solved this for me.

于 2013-10-03T13:29:21.617 回答
30

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

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

如果您从 xib 加载视图,则需要确保从自定义单元格视图、内容视图和您希望启用用户操作的元素中选中所有复选框:
在此处输入图像描述

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

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

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

于 2014-10-10T22:20:27.180 回答
6

问题是您的 nib 不包含 contentView,这是自 iOS 8 SDK 以来所要求的(我是根据经验编写的,没有可行的来源,抱歉)。

当您UITableViewController向情节提要添加一个 UITableViewCell 时,它会UITableView自动添加到其中。如果你看一下这个UITableView,你会contentView在里面看到一个。

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

于 2015-11-09T08:58:24.043 回答
5

这个问题的解决方案是;

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {    
cell.bringSubviewToFront(cell.YOUR_UIView)    
}

这对我有用。

于 2016-07-22T05:21:58.863 回答
4

我遇到了同样的问题。原来我在 IB 中创建了一个 UIView 对象,然后将它的类设置为 UITableViewCell 的子类。

由于我最初在 IB 中创建的对象是 UIView,因此 UITableViewCell contentView 直到运行时才被添加,这恰好位于我的 UIButtons 之上,使它们无法选择。

于 2014-01-10T22:05:35.617 回答
4

显然,有很多事情可能会出错,并且一些修复适用于某些 iOS 版本,而不适用于其他版本。

我的问题是我有一个 UIButton,它不是 cell.contentView 的直接子视图(即它是子视图的子视图)。我必须将我的按钮直接添加到 cell.contentView 以便它可以点击。(iOS v8+)

于 2015-12-17T21:09:15.780 回答
3

我一直遇到同样的问题。原因是

self.contentView.Frame.size.height

始终为 44。

有一个建议您可以在覆盖方法中设置您self.contentView.Frameself.frame-(void)layoutSubviews问题将得到解决

于 2015-04-21T11:45:17.047 回答
3

我的细胞大纲

就我而言,我希望用户与之交互的所有内容都在 ContentView 之外。此外,我不希望单元格在被选中时突出显示。

所有标签(名称、类别等)都位于“内容视图”下。网站按钮不在“内容视图”下,而是在“本地目录表单元格”下。

在我的 tableViewController 方法 tableView:cellForRowAtIndexPath: 我有以下代码: cell.contentView.userInteractionEnabled = NO;

就是这样,用户可以与按钮进行交互。我不使用 [cell bringSubviewToFront:cell.websiteButton];

于 2013-11-22T23:21:27.160 回答
2

正如其他人指出的那样,始终将子视图添加到单元格的内容视图中。如果您有重写layoutSubviews方法,请确保调用超级实现。忘记调用超级实现会产生意想不到的结果。

于 2013-12-20T04:38:36.917 回答
2

我的情节提要的原型单元格中的 UIButton 有同样的问题。我通过在原型单元格上检查“启用用户交互”来解决它。这适用于 iOS 7.1。

于 2014-05-23T17:19:08.997 回答
2

我在这里没有看到的最明显的错误是你必须有一个 selectedBackgroundImage 才能让 UIButton 在被选中时看起来不同。这些不像 UITableViewCells。

myButton.setBackgroundImage(UIImage(named: "ButtonBackgroundSelected.png"), forState: .Highlighted)
于 2016-06-04T14:24:51.117 回答
2

我将 UITableViewCell 子类化并通过更改此代码解决了它:

addSubview(myButton)

对此:

contentView.addSubview(myButton)

在我的 UITableViewCell 子类中。

于 2020-11-17T19:31:46.887 回答
1

我在 UITableViewCell 和 UICollectionViewCell 上都遇到了类似的问题。要遵循的几个步骤:

  1. 始终将子视图添加到单元格视图的内容视图,而不是单元格视图本身
  2. 如果您要添加容器视图(其中包含您的按钮),请禁用容器视图的自动布局并仅为容器视图内的内容启用自动布局。对容器视图使用框架布局。

简而言之,TableView/CollectionView 单元格不能采用启用自动布局的可操作子视图(UIButton、UISegmentedControl)。如果您需要它,请禁用自动布局并提供框架(或)将它们放在容器视图中(容器视图应禁用自动布局)并将可操作视图(具有自动布局)作为子视图添加到容器视图.

于 2013-12-19T01:15:04.590 回答
1

就我而言,我还需要检查单元格本身(不仅仅是 contentView)的“用户交互已启用”。但正如其他答案所述,发生这种情况可能有多种原因,所以我相信这不适用于每种情况。

在此处输入图像描述

于 2014-10-13T21:28:33.500 回答
0

足够连线,对我来说实际的解决方案是转到故事板,在单元格中选择 contentview,然后检查“userInteractionEnabled”......否则即使您在按钮或单元格上启用了 userInteraction,contentview 也会始终阻止操作.

于 2014-11-06T18:25:15.740 回答
0

我对该单元有透明的看法,该单元实现了一些内部功能并处理了对自我的触摸。

于 2014-12-04T10:08:36.150 回答
0

None of these answers worked for me.

The only way I was able to fix this problem was to set the table cell selection from single to none. After that, I was able to receive button call backs.

于 2014-05-09T17:31:50.690 回答
0

当您使用 Interface Builder (Storyboard) 时,请务必User Interaction EnabledContent View

于 2014-03-19T10:52:36.987 回答
0

我检查了所有内容,但在情节提要中犯了一个愚蠢的错误,我的按钮的超级视图低于其他视图。所以触摸没有传递给我的按钮。

于 2016-04-25T05:49:39.587 回答
0

如果你有一个 CUSTOM 单元类,只需包含self.selectionStyle = .noneawakeFromNib()

override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        self.selectionStyle = .none
    }
于 2020-12-22T22:07:29.610 回答
0

在 Swift 5 中,我创建了一个 UITableViewCell 类并创建了一个 UIButton。

class DashboardingGameTableViewCell: UITableViewCell {
    
    // MARK: Setup Views
    
    var showInteractiveButton: UIButton = {
        let interactive = UIButton()
        interactive.setTitle("", for: .normal)
        interactive.contentEdgeInsets = UIEdgeInsets(top: 10.0, left: 10.0, bottom: 10.0, right: 10.0)
        interactive.setImage(UIImage(systemName: "ellipsis"), for: .normal)
        interactive.tintColor = .white
        interactive.backgroundColor = .clear
        interactive.translatesAutoresizingMaskIntoConstraints = false
        
        return interactive
    }()
    ...

在我的

class DashboardingGameViewController: UIViewController, UITableViewDelegate, UITableViewDataSource...

UIButton 不可点击

因为它有效,我必须...

在 DashboardGameViewController: UITableViewCell...

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    
    contentView.isUserInteractionEnabled = false
    addSubview(showInteractiveButton)
...

在 DashboardGameViewController 上:UIViewController、UITableViewDelegate、UITableViewDataSource...

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: reusableIdentifier,
                                                            for: indexPath) as! DashboardingGameTableViewCell
        
        cell.showInteractiveButton.addTarget(self, action: #selector(interactiveGames(_:)), for: .touchUpInside) 
    ...
  
// MARK: - Private Funcs 
    
@objc private func interactiveGames(_ button: UIButton) {
                present(ShowInteractiveGameViewController(), animated: true, completion: nil)
}
于 2020-10-31T01:38:51.730 回答
0

我的问题是我添加了默认情况下禁用用户交互UIButton的子视图。所以我不得不启用它:UIImageView

imageView.isUserInteractionEnabled = true
于 2020-03-23T15:51:10.907 回答
-1

好的,我已经找到了解决这个问题的方法,但这似乎是一个巨大的 hack;但是,这是我所能想到的(这里没有其他东西对我有用)。

在我的顶部,我button添加了一个 UITextField,它代表有问题的表格视图单元格。该 tableViewCell 实例实现-(BOOL) textFieldShouldBeginEditing:(UITextField *)textField并返回NO.

于 2014-09-23T17:04:57.897 回答