如何使用 swift 在 UICollectionView 单元格中加载自定义单元格 ( xib )
How to load custom cell ( xib) in UICollectionView cell using swift
我使用 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,如下图所示。在此 viewcollection 中,我需要那个橙色单元格来包含要在运行时加载的自定义 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
}
}
}
这是您可以做的,
将您的 MyCustomView
class 更改为 UICollectionViewCell 而不是 UIView 的子class。
从 MyCustomView
中删除 override init(frame : CGRect)
,required init?(coder aDecoder: NSCoder)
,func xibSetup()
,func loadViewFromNib() -> UIView
我真的无法理解您如何将 setter 和 getter 用于 mytitleLabelText 和 myCustomImage。如果没用,也把它去掉。
最后,MyCustomView 中只剩下 IBOutlets。
为了更好的编码实践,将名称从 MyCustomView 更改为 MyCustomCell(可选)
转到您的 xib,select xib 并将其 class 设置为 MyCustomView。
- 在同一屏幕中将文件所有者更改为托管集合视图的视图控制器
- 在您的 viewController 的 ViewDidLoad 中注册您的笔尖。
self.collectionView.registerNib(UINib(nibName: "your_xib_name", bundle: nil), forCellWithReuseIdentifier: "your_reusable_identifier")
- 在 cellForItemAtIndexPath 中,
let cell : MyCustomView = collectionView.dequeueReusableCellWithReuseIdentifier("your_reusable_identifier", forIndexPath: indexPath) as! MyCustomView
cell.lblName.text = "bla bla" //access your Cell's IBOutlets
return cell
- 最后,为了控制单元格的大小,要么覆盖 collectionView 的委托,要么简单地转到您的 collectionView select 中的 collectionCell 并拖动它以匹配您的尺寸:)就是这样:)
编码愉快。搜索教程以获得更好的理解。我无法解释所有代表,因为我最终会在这里写一篇博客。
编码愉快
对于Swift 4.0
在 viewDidLoad:
//custom collectionViewCell
mainCollectionView.register(UINib(nibName: "your_customcell_name", bundle: nil), forCellWithReuseIdentifier: "your_customcell_identifier")
在 cellForItemAt indexPath:
let cell : <your_customcell_name> = mainCollectionView.dequeueReusableCell(withReuseIdentifier: "your_customcell_identifier", for: indexPath) as! <your_customcell_name>
并且不要忘记在 xib 部分为您的自定义单元格设置标识符。
如果您必须注册多个单元格,则使用一行方法。
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)
}
}
使用步骤
将您的 Cell 标识符命名为 "YourcellName" + "Identifier"
例如:
CustomCellIdentifier
如果您的单元格名称是 CustomCell。
CustomCell.register(for: collectionView)
对于Swift 4.2
在 viewDidLoad
self.collectionView.register(UINib(nibName: "your_xib_name", bundle: nil), forCellWithReuseIdentifier: "your_reusable_identifier")
在 cellForItemAt 索引路径中:
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "your_reusable_identifier", for: indexPath) as! MyCustomView
当然正如@Raj Aryan 所说:
不要忘记在 xib 部分为您的自定义单元格设置标识符。
我使用 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,如下图所示。在此 viewcollection 中,我需要那个橙色单元格来包含要在运行时加载的自定义 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
}
}
}
这是您可以做的,
将您的
MyCustomView
class 更改为 UICollectionViewCell 而不是 UIView 的子class。从
MyCustomView
中删除 我真的无法理解您如何将 setter 和 getter 用于 mytitleLabelText 和 myCustomImage。如果没用,也把它去掉。
最后,MyCustomView 中只剩下 IBOutlets。
为了更好的编码实践,将名称从 MyCustomView 更改为 MyCustomCell(可选)
转到您的 xib,select xib 并将其 class 设置为 MyCustomView。
override init(frame : CGRect)
,required init?(coder aDecoder: NSCoder)
,func xibSetup()
,func loadViewFromNib() -> UIView
- 在同一屏幕中将文件所有者更改为托管集合视图的视图控制器
- 在您的 viewController 的 ViewDidLoad 中注册您的笔尖。
self.collectionView.registerNib(UINib(nibName: "your_xib_name", bundle: nil), forCellWithReuseIdentifier: "your_reusable_identifier")
- 在 cellForItemAtIndexPath 中,
let cell : MyCustomView = collectionView.dequeueReusableCellWithReuseIdentifier("your_reusable_identifier", forIndexPath: indexPath) as! MyCustomView
cell.lblName.text = "bla bla" //access your Cell's IBOutlets
return cell
- 最后,为了控制单元格的大小,要么覆盖 collectionView 的委托,要么简单地转到您的 collectionView select 中的 collectionCell 并拖动它以匹配您的尺寸:)就是这样:)
编码愉快。搜索教程以获得更好的理解。我无法解释所有代表,因为我最终会在这里写一篇博客。
编码愉快
对于Swift 4.0
在 viewDidLoad:
//custom collectionViewCell
mainCollectionView.register(UINib(nibName: "your_customcell_name", bundle: nil), forCellWithReuseIdentifier: "your_customcell_identifier")
在 cellForItemAt indexPath:
let cell : <your_customcell_name> = mainCollectionView.dequeueReusableCell(withReuseIdentifier: "your_customcell_identifier", for: indexPath) as! <your_customcell_name>
并且不要忘记在 xib 部分为您的自定义单元格设置标识符。
如果您必须注册多个单元格,则使用一行方法。
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)
}
}
使用步骤
将您的 Cell 标识符命名为
"YourcellName" + "Identifier"
例如:CustomCellIdentifier
如果您的单元格名称是 CustomCell。CustomCell.register(for: collectionView)
对于Swift 4.2 在 viewDidLoad
self.collectionView.register(UINib(nibName: "your_xib_name", bundle: nil), forCellWithReuseIdentifier: "your_reusable_identifier")
在 cellForItemAt 索引路径中:
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "your_reusable_identifier", for: indexPath) as! MyCustomView
当然正如@Raj Aryan 所说: 不要忘记在 xib 部分为您的自定义单元格设置标识符。