【问题标题】:UIButton not responding used in a custom UITableViewCell自定义 UITableViewCell 中使用的 UIButton 没有响应
【发布时间】:2016-05-23 07:14:43
【问题描述】:

我知道这个问题已经在 SO 中被问过几次。尽管尝试了这些,但我仍然无法解决我的问题。

我在 UIViewController 中使用 UITableView。我有一个自定义 UITableViewCell ,其中有几个按钮。但是,我无法让 Button 响应 Click 事件。

开发环境为 iOS 9 和 Swift 2

使用的片段:

BranchNearMeTableViewCell.swift 包含

@IBOutlet weak var btnDetails: UIButton!

查看控制器类

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("branchNearTableCell") as! BranchNearMeTableViewCell

 cell.btnDetails.tag = indexPath.row
        cell.btnDetails.addTarget(self, action: "showDetails:", forControlEvents: .TouchUpInside)

}

func showDetails(sender: UIButton){

        print("Button Pressed:")
    }

附加信息:

TableView 和 TableCellView 在界面生成器中禁用了用户交互,因为不希望整个单元格都可以点击。

TableViewCell 内的 UIButton 启用了用户交互。

作为一个 iOS 菜鸟,我可能犯了一个我可能忽略的愚蠢错误。

我检查的类似问题包括:

SO1

SO2

SO3

非常感谢有关此问题的任何帮助。

【问题讨论】:

  • 启用用户交互并单击情节提要中的单元格。有一个名为“Selection”的设置并将其设置为“None”。
  • 我们需要应用哪些控制? Tableviewcell 和按钮?
  • 一切都应该启用用户交互。然后选择表格视图单元格并禁用 selection 属性。
  • 感谢@AlejandroIván 它现在可以识别 click 。但抛出异常“无法识别的选择器发送到实例”
  • 感谢@AlejandroIván 完成工作

标签: ios swift uitableview uibutton


【解决方案1】:

我遇到了类似的问题。我通过addSubview 以编程方式将UIButton 添加到UITableViewCell。该按钮不会响应触摸事件。使用调试视图层次结构,我终于发现添加到UITableViewCell 的任何子视图都在contentView 后面,这会阻止用户输入到达UIButton。通过将UIButton 添加到contentView 而不是UITableViewCell,此问题已得到解决。

【讨论】:

  • 非常感谢!总是在我的单元格内使用 addSubview 定位东西,但是 contentView.addSubview 是有效的。 +1 链接教程以及
  • 这个答案对我有用。非常感谢你
  • 将视图添加到 contentView 有其缺点。我是菜鸟,一周前发现这很有帮助,现在在阅读了很多内容来修复我的错误之后,不得不对这个答案投反对票。
  • 这在 iOS 的更高版本中一定有所改变。在一些旧的冷基地中,直接将按钮添加到单元格总是有效的。但是在某些时候它停止工作,现在我必须将按钮添加到 contentView
  • 谢谢!我一直在寻找几个小时
【解决方案2】:

我也会在表格视图单元格上将userInteractionEnabled 设置为true。我会阻止使用UITableView allowsSelectionfalse 的水龙头

还要记住删除tableView:cellForRowAtIndexPath:中的目标和动作,因为单元格被回收,按钮可能已经有目标和动作,它可能会添加第二个。

【讨论】:

  • 谢谢Kyle,你能建议在哪里写目标和动作,而不是tableVIew:cellForRowAtIndexPath?
  • 从按钮创建一个 IBOutlet 是故事板,就像您使用任何其他按钮一样
【解决方案3】:

我找到了一个简单的解决方案:

继承UITableViewCell,并重写init()

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    //init subviews, eg. self.switch = UISwitch()
    super.init(style: style, reuseIdentifier: reuseIdentifier)
                
    // add this line magic code 
    contentView.isUserInteractionEnabled = true
                
    //add subviews, e.g. self.addSubView(self.switch)
}

【讨论】:

【解决方案4】:

你只需要做(在 ViewDidLoad 中):

mTableView.delaysContentTouches = false

【讨论】:

    【解决方案5】:

    我今天遇到了这个问题,静态 UITableview 单元格中有一个按钮,它没有响应用户事件。 我意识到单元格的“内容视图”也有一个“启用用户交互”复选框。确保在文档大纲菜单中的 UITableview 单元格内选择“内容视图”,然后在“属性检查器”中勾选“启用用户交互”框 - 请参阅附图以供参考。还需要检查单元格的“用户交互已启用”才能正常工作。 希望这可以帮助。 XCcode screen shot

    【讨论】:

      【解决方案6】:

      对于以编程方式创建的视图,唯一要记住的是在UITableViewCell 中使用lazy var 声明按钮。并且还将子视图添加到contentView 而不是单元格本身例如:

      class CounterCell: UITableViewCell {
      
          lazy var incrementButton: UIButton = {
              let button = UIButton()
              button.setTitle("+", for: .normal)
              button.addTarget(self, action: #selector(incrementAction), for: .touchUpInside)
              return button
          }()
      
          override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
              super.init(style: style, reuseIdentifier: reuseIdentifier)
              contentView.addSubview(incrementButton)
              // Your constrains here
          }
      
          @objc func incrementAction() {
          }
      
      }
      

      以编程方式使用视图时,无需添加.userInteractionEnabled 标志。

      然后要将操作从单元格中取出,只需添加一个委托并从UITableViewDataSource 分配它。

      【讨论】:

        【解决方案7】:

        另外,请确保您在按钮设置之外添加目标操作。所以不是

        let button: UIButton = {
            //addTarget...
        }()
        

        您可以在发生某些事情后设置按钮:

        func setButtonsUp() {
            // myButton.addTarget
        }
        

        【讨论】:

          【解决方案8】:

          乍一看,您的代码似乎没有任何问题。
          所以我建议你给按钮的superview添加背景颜色,为什么?因为如果按钮位于其父视图的框架之外,它将永远不会收到触摸。
          如果您看到按钮不在背景颜色内,则可能是您在定位项目时遇到问题,请检查约束或您正在使用的任何内容。 还要检查按钮的框架。
          您也可以通过在运行时检查视图来完成这两项操作,here 教程。

          【讨论】:

          • 感谢 Andrea,通过添加背景颜色尝试了您的建议,按钮位于超级视图颜色内。
          【解决方案9】:

          我不知道代码有什么问题,但我可以建议我个人使用哪个,它对我有用

          在 BranchNearMeTableViewCell.swift 中

          @IBOutlet var btnDetails: UIButton!
          @IBAction func btnDetailsClick(sender: AnyObject) {
              tapButton?(self)
          }
          var tapButton: (UITableViewCell -> Void)?
          

          在表格视图控制器中

          func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
                  let cell = tableView.dequeueReusableCellWithIdentifier("branchNearTableCell") as! BranchNearMeTableViewCell
          
           cell.tapButton = {(user) in
                       //User will be tablecell here do whatever you want to do here
                  }
          
          }
          

          所以如果你点击表格单元格中的按钮,这个 cell.tapButton 将被调用,你可以在这里做任何你想做的事情

          【讨论】:

          • 我可以知道您在设计中启用和禁用了哪些属性,例如 TableView 和 TableViewCell 的用户交互和选择
          • 按钮默认启用用户交互,如果启用了按钮交互,则无论tableviewproperties如何,它都应该工作
          • 分享 xib 的要点并查看控制器文件,然后我们才能更多地调试问题
          【解决方案10】:

          我们唯一需要做的就是在 cellForRowAt 中输入:

          cell.selectionStyle = .none
          

          这样,UITableview 将绕过选择单元格的触摸,并允许我们单元格内的按钮可点击。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-04-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多