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

时间:2013-09-17 11:30:23

标签: ios uitableview uibutton ios7

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

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

24 个答案:

答案 0 :(得分:68)

对我有用的是:

contentView.userInteractionEnabled = NO;
从nib加载我的自定义单元格后调用

。看起来这个内容视图在创建nib文件中定义的视图后被创建并设置为顶级子视图。

答案 1 :(得分:32)

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

答案 2 :(得分:27)

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

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

如果要从xib加载视图,则需要确保从自定义单元格视图,内容视图以及要启用用户操作的元素,都选中了复选框:
enter image description here

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

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

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

答案 3 :(得分:6)

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

向故事板添加UITableViewController时,会自动向其添加UITableViewCell UITableView。如果您查看此UITableView,则会在其中看到contentView

因此,当您继承UITableViewCell并使用.xib创建它时,您必须点击并将UITableViewCell拖到xib而不是默认{{1} }} 即可。然后不要忘记将文件所有者类和UIView类设置为您的子类。

答案 4 :(得分:4)

显然,有许多问题可能会出错,某些修复程序可以在某些iOS版本上运行而不在其他版本上运行。

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

答案 5 :(得分:4)

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

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

答案 6 :(得分:4)

解决这个问题的方法是;

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

这适合我。

答案 7 :(得分:3)

My Cell's outline

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

所有标签(名称,类别等)都紧跟在“内容视图”下。 WebsiteButton不在“内容视图”下,但它位于“本地目录表单元格”下。

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

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

答案 8 :(得分:2)

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

myButton.setBackgroundImage(UIImage(named: "ButtonBackgroundSelected.png"), forState: .Highlighted)

答案 9 :(得分:2)

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

self.contentView.Frame.size.height

总是44岁。

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

答案 10 :(得分:2)

我在故事板中的原型单元格中遇到了与UIButton相同的问题。我通过检查原型单元格上的“User Interaction Enabled”来解决它。这适用于iOS 7.1。

答案 11 :(得分:2)

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

答案 12 :(得分:1)

就我而言,我需要检查单元格本身(不仅仅是contentView)的“User Interaction Enabled”。但正如其他答案中所指出的,可能有多种原因导致这种情况发生,所以我相信这不适用于所有情况。

enter image description here

答案 13 :(得分:1)

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

  1. 始终将子视图添加到单元格视图的内容视图中,而不是单元格视图本身
  2. 如果要添加容器视图(包含按钮),请禁用容器视图的自动布局,并仅为容器视图内的内容启用自动布局。使用框架布局作为容器视图。
  3. 简而言之, TableView / CollectionView单元格无法获取启用自动布局的可操作子视图(UIButton,UISegmentedControl)。如果您需要它,请禁用自动布局并提供框架(或)将它们放在容器视图中(容器视图应禁用自动布局)并将可操作视图(具有自动布局)作为子视图添加到容器视图

答案 14 :(得分: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不可点击

因为要奏效,我必须做...

在DashboardingGameViewController上:UITableViewCell ...

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

在DashboardingGameViewController上: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)
}

答案 15 :(得分:0)

我的问题是我将UIButton添加为UIImageView的子视图,该视图默认情况下已禁用。所以我必须启用它:

imageView.isUserInteractionEnabled = true

答案 16 :(得分:0)

我已经继承了UITableViewCell并通过更改以下代码来解决:

addSubview(myButton)

对此:

contentView.addSubview(myButton)

在我的UITableViewCell子类中。

答案 17 :(得分:0)

如果您有自定义单元格类,只需在 self.selectionStyle = .none 中包含 awakeFromNib()

override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        self.selectionStyle = .none
    }

答案 18 :(得分:0)

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

答案 19 :(得分:0)

我对该单元格有透明的视图,它实现了一些内部功能,并在自我触摸时处理。

答案 20 :(得分:0)

有线,我的实际解决方案是转到故事板,在单元格中选择内容视图,并检查&#34; userInteractionEnabled&#34; ...否则即使您已在按钮上启用了userInteraction或cell,contentview将始终阻止该操作。

答案 21 :(得分:0)

好的,我已经找到了这个问题的解决方案,但它似乎是一个巨大的黑客攻击;然而,这是我能够想到的(这里没有其他任何东西可供我使用)。

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

答案 22 :(得分:0)

这些答案都不适合我。

我能够解决这个问题的唯一方法是将表格单元格选择从单个设置为无。之后,我能够收到按钮回拨。

答案 23 :(得分:0)

当您使用Interface Builder(故事板)时,请务必查看User Interaction Enabled

中的Content View复选框