以编程方式添加到 collectionviewcell 时未启用按钮

Posted

技术标签:

【中文标题】以编程方式添加到 collectionviewcell 时未启用按钮【英文标题】:Button not enabled when added programmatically to collectionviewcell 【发布时间】:2018-12-05 06:15:06 【问题描述】:

当我以编程方式将按钮添加到自定义 UICollectionViewCell 类时,它不可点击并且不会运行我附加到它的功能。

到目前为止我已经尝试过这些:

Button inside CollectionView not clickable Swift - UIButton in UICollectionViewCell not clickable

但没有得到任何运气。

在我的单元格类中,我有:

let toggleButton: UIButton = 
    let tb = UIButton(type: .custom) as UIButton
    tb.setTitleColor(.white, for: .normal)
    tb.setTitle("Example", for: .normal)
    tb.titleLabel?.font = UIFont.customFont(name: "InterUI-Medium", size: 18)
    tb.backgroundColor = UIColor(red:0.36, green:0.69, blue:0.55, alpha:1.0)
    tb.layer.cornerRadius = 5
    tb.titleLabel?.adjustsFontSizeToFitWidth = true
    tb.titleLabel?.minimumScaleFactor = 0.4
    tb.translatesAutoresizingMaskIntoConstraints = false
    tb.addTarget(self, action: #selector(topButtonTouched), for: .touchUpInside)
    return tb
()

func setupView() 
    self.addSubview(toggleButton)

    let menuAndToggleConstraints = [
        toggleButton.centerYAnchor.constraint(equalTo: self.centerYAnchor),
        toggleButton.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -100,
        toggleButton.widthAnchor.constraint(equalToConstant: 150)
    ]
    NSLayoutConstraint.activate(menuAndToggleConstraints)


override init(frame: CGRect) 
    super.init(frame: frame)
    setupView()


required init?(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)
    setupView()

在单元格中设置按钮。我试过 self.isUserInteractionEnabled 来查看是否有任何冲突,但它没有解决任何问题。我在单元格中还有另一个手势识别器,我试过没有它,但按钮仍然不可点击。

编辑: 这是我的委托和调用 collectionView 以更改 indexPath 大小的函数:

weak var delegate: ExpandedCellDelegate?
public var indexPath: IndexPath!

@objc func topButtonTouched(_ sender: UIButton) 
    print("hello")
    if let delegate = self.delegate
        delegate.topButtonTouched(indexPath: indexPath)
    

我确保在 CollectionView 类的 cellForRow 函数中将委托和 indexPath 设置为 self,如 this answer 中所示。

【问题讨论】:

***.com/questions/41456441/… 【参考方案1】:

我可以通过放置这个来使按钮工作:

tb.addTarget(self, action: #selector(topButtonTouched), for: .touchUpInside)

像这样进入 setupView() 方法:

func setupView() 
    self.addSubview(toggleButton)
    toggleButton.addTarget(self, action: #selector(topButtonTouched), for: .touchUpInside)

    let menuAndToggleConstraints = [
        toggleButton.centerYAnchor.constraint(equalTo: self.centerYAnchor),
        toggleButton.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -100,
                                               toggleButton.widthAnchor.constraint(equalToConstant: 150)
            ]
            NSLayoutConstraint.activate(menuAndToggleConstraints)

不确定它是否正确,但它有效。

【讨论】:

以上是关于以编程方式添加到 collectionviewcell 时未启用按钮的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将按钮添加到导航栏

如何以编程方式将空间添加到任务控制?

以编程方式将字典添加到 Plist

以编程方式将 ScriptManager 添加到页面?

以编程方式将 UILabel 添加到 UICollectionViewCell

检查视图元素是不是以编程方式添加到布局中