ios 如何使用swift加载UICollectionView单元格中的自定义单元格(xib)

emeijp43  于 2022-12-27  发布在  iOS
关注(0)|答案(4)|浏览(218)

我已经用Swift创建了一个小的样例项目。我已经创建了一个"MyCustomView"作为xib,它包含标签,按钮和imageView,如下面的代码所示:

import UIKit

@IBDesignable class MyCustomView: UIView {

    @IBOutlet weak var lblName: UILabel!
    @IBOutlet weak var btnClick: UIButton!
    @IBOutlet weak var myImageView: UIImageView!

    var view:UIView!

    @IBInspectable
    var mytitleLabelText: String? {
        get {
            return lblName.text
        }
        set(mytitleLabelText) {
            lblName.text = mytitleLabelText
        }
    }

    @IBInspectable
    var myCustomImage:UIImage? {
        get {
            return myImageView.image
        }
        set(myCustomImage) {
            myImageView.image = myCustomImage
        }
    }

    override init(frame : CGRect)
    {
        super.init(frame: frame)
        xibSetup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        xibSetup()
    }

    func xibSetup()
    {
        view = loadViewFromNib()
        view.frame = self.bounds

        // not sure about this ?
        view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
        addSubview(view)
    }

    func loadViewFromNib() -> UIView {

        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: "MyCustomView", bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView

        return view
    }
}

随附xib的图像以供参考。

在StoryBoard-〉ViewController中添加了UIViewCollection,如下图所示。在这个视图集合中,我需要橙色单元格来包含我的自定义xib,以便在运行时加载。
我如何实现这一目标?

Sandeep建议的新修改代码
//1导入UIKit

class ViewController: UIViewController {

    @IBOutlet weak var collectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.collectionView.register(UINib(nibName: "MyCustomView", bundle: nil), forCellWithReuseIdentifier: "myCell")

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 7
    }

    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        let cell : MyCustomView = collectionView.dequeueReusableCellWithReuseIdentifier("your_reusable_identifier", forIndexPath: indexPath) as! MyCustomView

        cell.lblName.text = "MyNewName"
        return cell
    }
}

//2导入UIKit

@IBDesignable class MyCustomView: UICollectionViewCell {

    @IBOutlet weak var lblName: UILabel!
    @IBOutlet weak var btnClick: UIButton!
    @IBOutlet weak var myImageView: UIImageView!

    var view:UIView!

    @IBInspectable
    var mytitleLabelText: String? {
        get {
            return lblName.text
        }
        set(mytitleLabelText) {
            lblName.text = mytitleLabelText
        }
    }

    @IBInspectable
    var myCustomImage:UIImage? {
        get {
            return myImageView.image
        }
        set(myCustomImage) {
            myImageView.image = myCustomImage
        }
    }

}
7gs2gvoe

7gs2gvoe1#

你可以这么做,
1.将MyCustomView类更改为UICollectionViewCell的子类,而不是UIView的子类。
1.从MyCustomView中删除override init(frame : CGRect)required init?(coder aDecoder: NSCoder)func xibSetup()func loadViewFromNib() -> UIView
1.我真的不明白你是如何使用你的setter和getter为mytitleLabelText和myCustomImage。如果它没有用,摆脱它以及。
1.最后,在MyCustomView中只剩下IBOutlets。
1.为了更好地进行编码,请将名称从MyCustomView更改为MyCustomCell(可选)
1.转到您的xib,选择xib并将其类设置为MyCustomView。

1.在同一屏幕中,将文件所有者更改为托管collectionView的yourView控制器

1.在viewController的ViewDidLoad中注册您的笔尖。

self.collectionView.registerNib(UINib(nibName: "your_xib_name", bundle: nil), forCellWithReuseIdentifier: "your_reusable_identifier")

1.在索引路径项的单元格中,

let cell : MyCustomView = collectionView.dequeueReusableCellWithReuseIdentifier("your_reusable_identifier", forIndexPath: indexPath) as! MyCustomView
cell.lblName.text = "bla bla" //access your Cell's IBOutlets
return cell

1.最后,为了控制单元格的大小,要么覆盖collectionView的委托,要么直接转到您的collectionView,选择其中的collectionCell并拖动它以匹配您的维度:)就是这样:)
愉快的编码。搜索教程以获得更好的理解。我不能解释所有的委托,因为我将在这里写博客。

rdlzhqv9

rdlzhqv92#

适用于Swift 4.0
视图Did加载中:

//custom collectionViewCell
mainCollectionView.register(UINib(nibName: "your_customcell_name", bundle: nil), forCellWithReuseIdentifier: "your_customcell_identifier")

索引路径处的单元格项目中:

let cell : <your_customcell_name> = mainCollectionView.dequeueReusableCell(withReuseIdentifier: "your_customcell_identifier", for: indexPath) as! <your_customcell_name>

并且不要忘记在xib节中为您的自定义单元格设置标识符。

6ojccjat

6ojccjat3#

如果必须配准多个单元格,则使用一行方法。

extension UICollectionViewCell {

    static func register(for collectionView: UICollectionView)  {
        let cellName = String(describing: self)
        let cellIdentifier = cellName + "Identifier"
        let cellNib = UINib(nibName: String(describing: self), bundle: nil)
        collectionView.register(cellNib, forCellWithReuseIdentifier: cellIdentifier)
    }
}

使用步骤

1.将您的小区标识符命名为"YourcellName" + "Identifier",例如:CustomCellIdentifier(如果单元格名称为CustomCell)。

  1. CustomCell.register(for: collectionView)
n6lpvg4x

n6lpvg4x4#

对于viewDidLoad中的Swift 4.2

self.collectionView.register(UINib(nibName: "your_xib_name", bundle: nil), forCellWithReuseIdentifier: "your_reusable_identifier")

在索引路径处的单元格中:

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "your_reusable_identifier", for: indexPath) as! MyCustomView

当然,正如@Raj Aryan所说:别忘了在xib部分为你的自定义单元设置标识符。

相关问题