【问题标题】:Button in UITableViewCell not responding under ios 7UITableViewCell中的按钮在ios 7下没有响应
【发布时间】:2013-09-21 19:45:22
【问题描述】:

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

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

【问题讨论】:

  • 刚才遇到了同样的问题。通过确保将按钮添加到内容视图(即 [self.contentView addSubview:button])来解决,这似乎在 iOS6 和 iOS7 之间发生了变化。 FWIW,我认为这个问题相当清楚。我能想到添加的唯一代码是所有通用 UITableView 的东西。
  • 厌倦了那些甚至没有试图理解事情就搁置事情的人。我有同样的问题,一旦你遇到它就很清楚了!不需要代码。确实是 iOS7 中的重大变化。
  • 大家好,面临同样的问题,我正在为单元格使用自定义笔尖,突然它们在 ios7 中都没有交互......有什么线索吗?
  • @Xavier - 你能放到github上吗?
  • 可能您需要创建自定义单元格类并将所有内容添加到内容视图而不是 XIB 中。这对我有用.. 不需要 XIB 只需要 usr [self.ContentView addSubView:yourbutton]

标签: ios uitableview uibutton ios7


【解决方案1】:

对我有用的是:

contentView.userInteractionEnabled = NO;

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

【讨论】:

  • 从技术上讲,按钮是 contentView 的子视图。将其设置为 0 将禁用该按钮。我错过了什么?
  • 我也不明白为什么这个解决方案有效(而且 yonix 的解决方案也没有为我解决问题)。逻辑上说单元格的 contentView 将类似于 viewController 的视图...
  • 如果您在 Xcode 5 之前创建了自定义 UITableViewCell,则此方法有效,因为 contentView 对于 iOS 7 来说是新的。如果您的单元格是“旧样式”,则 contentView 会遮盖它,这就是为什么这在这些情况下有效。对于我们这些已经将我们的按钮作为 contentView 的子视图的人来说,这不起作用,解决方案的旅程仍在继续。
  • 非常感谢 :) 从字面上看,你救了我的命。我今天不得不冻结我的代码:)
【解决方案2】:

在从 nib 加载单元格后调用 [cell bringSubviewToFront:button] 为我解决了这个问题。

【讨论】:

  • 它对我不起作用。按钮也已经在“最前沿”
  • @JimThio 实际上我刚刚在这里找到了解决方案:devforums.apple.com/message/877894#877894,不知道为什么它会起作用。我猜在从 nib 加载单元格时,iOS7 中有一个错误会打乱视图顺序。
  • 这个工作的原因是 iOS 7 引入了一个中间 contentView 子视图来响应单元格触摸。如果此视图在您的按钮上方,它将接收触摸而不是按钮。 bringSubviewToFront 确保您的按钮位于视图堆栈的顶部。
  • 很好的答案 Yonix。我已经尝试了所有的解决方案,但没有一个能奏效。感谢您提供简单明了的回答
【解决方案3】:

我也一直在努力解决这个问题,我对 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.contentView 与您在 Interface Builder 中看到的 Content View 不同,它是由系统创建的 default content view,它位于自定义单元格视图中所有其他视图/元素的顶部,它掩盖了视图层次结构中的其余视图。因此,您需要先禁用用户交互,然后自定义单元格视图中的 UI 元素才能接收用户交互事件。希望这可以帮助。如果您有更好的解释,我很想听听:-)​​。同样是我的观察,可能还有其他原因。欢迎讨论!

【讨论】:

  • 非常感谢 us_davis,你解决了我的问题!禁用单元格 contentView userInteraction 以获得单元格交互是非常奇怪的。我真的不明白为什么 cell.contentView 会超过其他视图...
  • 我猜 Xcode 和界面生成器之间存在断开连接。在加载自定义 UITableViewCell 之前以某种方式创建了默认内容视图,我怀疑 Xcode 需要这样做以避免出现没有内容视图来容纳自定义单元格视图的问题。如果你有一个内容视图,它仍然会在你自己的顶部使用它的默认内容视图。我花了很长时间才知道。
  • self.contentView 的观察很好。这是根本原因。
  • 我花了一段时间才发现是这样。我很高兴这可以帮助其他有类似问题的人。
  • 谢谢!这正是我的问题,在 3d 调试视图层次结构中,tableviewcell 的 contentView 确实位于其他所有内容之前。
【解决方案4】:

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

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

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

【讨论】:

    【解决方案5】:

    这个问题的解决方案是;

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

    这对我有用。

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        显然,有许多问题可能会出错,并且某些修复程序适用于某些 iOS 版本,而不适用于其他版本。

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

        【讨论】:

          【解决方案8】:

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

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

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

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

          【讨论】:

            【解决方案9】:

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

            self.contentView.Frame.size.height
            

            总是 44。

            有一个建议你可以在覆盖方法中将self.contentView.Frame设置为self.frame——(void)layoutSubviews问题就解决了

            【讨论】:

            • 这个答案应该出现在更多帖子中;)
            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

              我的故事板原型单元格中的 UIButton 遇到了同样的问题。我通过在原型单元格上检查“启用用户交互”来解决它。这适用于 iOS 7.1。

              【讨论】:

                【解决方案12】:

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

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

                【讨论】:

                  【解决方案13】:

                  我继承了 UITableViewCell 并通过更改此代码解决了它:

                  addSubview(myButton)
                  

                  到这里:

                  contentView.addSubview(myButton)
                  

                  在我的 UITableViewCell 子类中。

                  【讨论】:

                    【解决方案14】:

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

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

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

                    【讨论】:

                      【解决方案15】:

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

                      【讨论】:

                        【解决方案16】:

                        当您使用 Interface Builder (Storyboard) 时,请务必选中 Content View 中的 User Interaction Enabled 复选框

                        【讨论】:

                          【解决方案17】:

                          这些答案都不适合我。

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

                          【讨论】:

                            【解决方案18】:

                            足够连线,我的实际解决方案是转到情节提要,选择单元格中的内容视图,然后检查“userInteractionEnabled”...否则即使您在按钮或单元格上启用了用户交互,内容视图将始终阻止动作。

                            【讨论】:

                              【解决方案19】:

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

                              【讨论】:

                                【解决方案20】:

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

                                【讨论】:

                                  【解决方案21】:

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

                                  imageView.isUserInteractionEnabled = true
                                  

                                  【讨论】:

                                    【解决方案22】:

                                    在 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)
                                    }
                                    

                                    【讨论】:

                                      【解决方案23】:

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

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

                                      【讨论】:

                                        【解决方案24】:

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

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

                                        【讨论】:

                                          猜你喜欢
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 1970-01-01
                                          • 2014-09-27
                                          • 2021-07-04
                                          • 1970-01-01
                                          • 2013-09-30
                                          相关资源
                                          最近更新 更多