Swift - 将委托连接到自定义 Xib 单元 [英] Swift - Connect Delegate to Custom Xib Cell

查看:30
本文介绍了Swift - 将委托连接到自定义 Xib 单元的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

[已解决]

解决方案

创建 Xib 文件时,我没有删除启动 UIView.而我必须删除此视图并在此 xib 中添加新的 CollectionViewCell 之后.

参考:

我添加了 didSelectItemAt 函数.当我尝试按..."按钮调用协议时, didSelectItemAt 有效.我认为这也是另一个错误.

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {打印(indexPath.row)}

AddTarget 操作无效.我的错误在哪里?请帮帮我!!!

@IBOutlet var shareButton: UIButton!弱变量委托:SearchCollectionCellDelegate?覆盖 funcawakeFromNib() {shareButton.addTarget(self, action: #selector(asd), for: .touchUpInside)}@objc func asd(){打印(asd")}

解决方案

使用了与您相同的代码,并且运行良好.无法弄清楚为什么它最终不起作用.

如果您没有得到解决方案,请尝试 Closures :

class SecondCollectionViewCell: UICollectionViewCell {var callbackOnButton : (()->())?覆盖 funcawakeFromNib() {super.awakeFromNib()//初始化代码}@IBAction func methodButton(_ sender: Any) {self.callbackOnButton?()}}

并在 cellForRowAtIndex 中添加:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) ->UICollectionViewCell {let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SecondCollectionViewCell", for: indexPath) as!第二集合视图单元格cell.callbackOnButton = {打印(单击按钮")}返回单元格}

[SOLVED]

Solution

When created a Xib File , I hadn't deleted the start UIView. Whereas I had to delete this view and after add new CollectionViewCell in this xib.

Reference: IBAction inside UITableViewCell not called in iOS 9


I use this structure so many times.When I write this delegate with using StoryBoard , it works properly but now it's not. Where is my mistake when use the xib files?

print(indexpath) doesn't work!

import UIKit

class SearchVC: UIViewController {

var searchUid:String?
var comingPage:String?
var searchElements = [ProductElement]()

var collection:UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()

    if comingPage == "ProductVC" {
        print(searchUid!)
    }

    let searchView : SearchListView = UIView.fromNib()
    searchView.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(searchView)

    searchView.topAnchor.constraint(equalTo: view.safeTopAnchor, constant: 0).isActive = true
    searchView.bottomAnchor.constraint(equalTo: view.safeBottomAnchor, constant: 0).isActive = true
    searchView.rightAnchor.constraint(equalTo: view.safeRightAnchor, constant: 0).isActive = true
    searchView.leftAnchor.constraint(equalTo: view.safeLeftAnchor, constant: 0).isActive = true
    searchView.backgroundColor = UIColor.white

    collection = searchView.collectionView
    collection.translatesAutoresizingMaskIntoConstraints = false

    collection.delegate = self
    collection.dataSource = self

    collection.register(UINib(nibName: "SearchCollectionCell", bundle: nil), forCellWithReuseIdentifier: "SearchCollectionCell")



    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    layout.minimumInteritemSpacing = 0
    layout.minimumLineSpacing = 10
    collection.collectionViewLayout = layout

    GetElements().search(keywords: ["\(searchUid!)"], contentTypes: ["contenttype_article"]) { (elements) in
        self.searchElements = elements
        self.collection.reloadData()
    }

}

}

extension SearchVC: UICollectionViewDelegate, UICollectionViewDataSource , UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return searchElements.count
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    var cell: SearchCollectionCell! = collectionView.dequeueReusableCell(withReuseIdentifier: "SearchCollectionCell", for: indexPath) as? SearchCollectionCell

    if cell == nil {
        collectionView.register(UINib(nibName: "SearchCollectionCell", bundle: nil), forCellWithReuseIdentifier: "SearchCollectionCell")
        cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SearchCollectionCell", for: indexPath) as? SearchCollectionCell

    }



    let url = URL(string: "\(String(describing: Config.fileServiceWFileUid!))\(String(describing: searchElements[indexPath.row].oneImage!))")
    cell.searchImage.kf.setImage(with: url)

    cell.productName.text = searchElements[indexPath.row].title
    cell.productCompany.text = searchElements[indexPath.row].description
    cell.delegate = self
    return cell
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: collectionView.bounds.size.width / 2 - 5 , height: 175)
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
   // print(indexPath.row)
}

}

extension SearchVC : SearchCollectionCellDelegate {

func searchCellShareButton(sender: SearchCollectionCell) {
    print("AA")
    if let indexpath = collection.indexPath(for: sender) {
        print(indexpath)
    }
}

}

//

protocol SearchCollectionCellDelegate{
    func searchCellShareButton(sender:SearchCollectionCell)
}

class SearchCollectionCell: UICollectionViewCell {

@IBOutlet var searchImage: UIImageView!
@IBOutlet var productName: UILabel!
@IBOutlet var productCompany: UILabel!

var delegate:SearchCollectionCellDelegate?

override func layoutSubviews() {
    searchImage.layer.cornerRadius = 4
}

@IBAction func cellShareButtonAction(_ sender: Any) {

    if delegate != nil {
        delegate?.searchCellShareButton(sender: self)
    }

}
}

[EDIT]

I added didSelectItemAt func. When I try to press "..." button for calling protocol, didSelectItemAt works. I think also this is another mistake.

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    print(indexPath.row)
}

[EDIT 2]

AddTarget Action didn't work. Where is my mistake? Please help me!!!

@IBOutlet var shareButton: UIButton!

weak var delegate:SearchCollectionCellDelegate?

override func awakeFromNib() {
    shareButton.addTarget(self, action: #selector(asd), for: .touchUpInside)
}

@objc func asd(){
    print("asd")
}

解决方案

Used the same code of your's and it is working perfectly fine. Can't figure out why it is not working at your end.

If you are not getting the solution try Closures :

class SecondCollectionViewCell: UICollectionViewCell {

    var callbackOnButton : (()->())?

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    @IBAction func methodButton(_ sender: Any) {
        self.callbackOnButton?()
    }
}

and in cellForRowAtIndex add :

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


    cell.callbackOnButton = {
        print("Button Clicked")
    }

    return cell
}

这篇关于Swift - 将委托连接到自定义 Xib 单元的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆