UICollectionViewCell协议不起作用



我在我的细胞类内有一个协议,该协议正在检测'editcommentInfeed'函数。我在单元格内创建了一个" edituntton",并使用" EditcommentField"定义处理程序,该处理程序正在调用每个委托函数,并给出两个参数。这两个参数很重要,我需要该单元格中的此信息才能在将来提供的动作中检测。

例如,当按钮按下单元格内部时,我试图打印一些东西。但是,即使此语句也不执行。


//This is the Cell Class
protocol CommentFeedProtocol {
    func editCommentInFeed(cell: CommentCell, comment: Comment)
}
class CommentCell: BaseCell {
      var delegate: CommentFeedProtocol?
      let editButton: UIButton = {
        let editbttn = UIButton(type: UIButton.ButtonType.system)
        editbttn.setImage(UIImage(named: "editButton"), for: UIControl.State.normal)
        editbttn.addTarget(self, action: #selector(editCommentField), for: UIControl.Event.touchUpInside)
        return editbttn
    }()

    override func setUpCell() {
        super.setUpCell()
        backgroundColor = UIColor.white

        setUpCommentCell()
    }
    fileprivate func setUpCommentCell(){
        addSubview(profileImageView)
        addSubview(editButton)
        addSubview(commentTextView)
        addSubview(seperator)
        profileImageView.anchor(top: topAnchor, left: leftAnchor, bottom: nil, right: nil, paddingTop: 8, paddingLeft: 8, paddingBottom: 0, paddingRight: 0, width: 40, height: 40)
        profileImageView.layer.cornerRadius = 40/2
        editButton.anchor(top: topAnchor, left: nil, bottom: bottomAnchor, right: rightAnchor, paddingTop: 5, paddingLeft: 0, paddingBottom: 5, paddingRight: 10, width: 45, height: 0)
        commentTextView.anchor(top: topAnchor, left: profileImageView.rightAnchor, bottom: bottomAnchor, right: editButton.leftAnchor, paddingTop: 4, paddingLeft: 4, paddingBottom: 4, paddingRight: 4, width: 0, height: 0)
        seperator.anchor(top: bottomAnchor, left: leftAnchor, bottom: nil, right: rightAnchor, paddingTop: 5, paddingLeft: 20, paddingBottom: 0, paddingRight: 20, width: 0, height: 1.5)

    }

    /*Objecthandler*/
    @objc func editCommentField(){
        guard let comment = comment else { return}
        delegate?.editCommentInFeed(cell: self, comment: comment)
    }

// This is the CollectionViewController
// As you can see I am also add the Protocol to the class 
class CommentsController: UICollectionViewController, UICollectionViewDelegateFlowLayout, CommentFeedProtocol {
override func viewDidLoad() {
        super.viewDidLoad()
        navigationItem.title = "Kommentare"
        postButton.imageView?.alpha = 0.5
        postButton.isEnabled = false

        collectionView.keyboardDismissMode = .interactive
        collectionView.register(CommentCell.self, forCellWithReuseIdentifier: commentCell)
        collectionView.alwaysBounceVertical = true
        self.collectionView.backgroundColor = UIColor.white
        fetchComments()
    }

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: commentCell, for: indexPath) as! CommentCell

        cell.comment = comments[indexPath.item]
        cell.delegate = self
        return cell
    }
// Here is the Delegate Function
    func editCommentInFeed(cell: CommentCell, comment: Comment) {
        print("Button was Pressed")
    }

您可以在示例中看到我将协议添加到类中,并在类中调用该功能。我没有收到错误消息。该按钮仅在单击时悬停,但不要执行任何操作?!

似乎未将委托人设置为您的ViewController。在cellForItemAt功能中,您需要设置cell.delegate = self。因此,当您的单元格调用delegate.editCommentInFeed时,它实际上调用了ViewController的editCommentInFeed实现功能。

您尚未在cellForItemAt中设置委托:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: commentCell, for: indexPath) as! CommentCell
    cell.comment = comments[indexPath.item]
    cell.delegate = self. // You forgot to add this line
    return cell
}

您可以在此处阅读更多有关它的信息:

  • https://developer.apple.com/library/archive/documentation/general/general/conceptual/cocoaencyclopedia/delegatesanddatasources/delegatesanddatasources/delegatesanddatasources.htatasources.html

您也可以搜索有关它的出色教程。

最新更新