我想将我的(BusinessViewTableHeader:UIView)作为tableView标题放置:
tableView.tableHeaderView = BusinessViewTableHeader.instanceFromNib() as! BusinessViewTableHeader
在BusinessViewTableHeader中有一个UICollectionView,它应该在刷卡时显示图像,就像Tinder应用程序一样。
这是我的UIView子类:
class BusinessViewTableHeader: UIView {
@IBOutlet var collectionView: UICollectionView!
override func awakeFromNib() {
super.awakeFromNib()
self.collectionView.delegate = self
self.collectionView.registerNib(UINib(nibName: "BusinessImageCollectionCell", bundle: nil), forCellWithReuseIdentifier: "BusinessImageCollectionCell")
}
class func instanceFromNib() -> UIView {
return UINib(nibName: "BusinessViewTableHeader", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! UIView
}
....
}
extension BusinessViewTableHeader: UICollectionViewDelegate, UICollectionViewDataSource {
....
}
我有一个包含UICollectionView的自定义UIView xib。问题是我无法将任何单元格(项)添加到UICollectionView。我可以将项添加到放在UIViewController中的其他UICollectionView。第一个图像显示UIViewController内UICollectionView的属性,第二个图像显示UIView xib内的UICollectionView。
[ 2
为什么我无法在UIView xib中的UICollectionView中添加项目?有没有办法做到这一点?
答案 0 :(得分:23)
当UICollectionView在Nib上时,您不能拥有UICollectionViewCell。您需要做的是将UICollectionViewCell创建为另一个nib,并将其注册到您用于CollectionView的类中。
创建一个新的nib,在其中拖动一个UICollectionViewCell,并在与UICollectionView一起使用的类中执行类似的操作。
override func awakeFromNib() {
let nibName = UINib(nibName: "ClassCollectionCell", bundle:nil)
collectionView.registerNib(nibName, forCellWithReuseIdentifier: "collectionCell")
}
请记住,您可以向UICollectionViewCell添加自定义类,以便将动态数据传递给它。
答案 1 :(得分:1)
不支持在xib中添加单元格。如果必须使用xib文件,则需要一个包含UICollectionView单元的单独xib。故事板可能是更好的解决方案。
目前尚不清楚您要实现的目标。 UICollectionView具有用于创建使用数据源和委托的标头的特定方法。集合视图适用于以网格布局或其他复杂布局显示项目。
如果你只需要显示一个行列表,那么UITableViewController可能是一个更容易的选择。
无论如何,最好使用一个storyboard而不是一个xib,并将UICollectionViewController或UITableViewController子类化,而不是子视图。
您的自定义类名可以在UIViewController或UIView的身份检查器中输入:
答案 2 :(得分:1)
在 Swift 3.0 中使用以下方法注册nib -
let nibName = UINib(nibName: "FruitCell", bundle:nil)
collectionView.register(nibName, forCellWithReuseIdentifier: "CellIdentifier")
答案 3 :(得分:1)
在Swift 3.0中
首先创建UIView的Xib文件
import UIKit
class SubCatagoryListView:UIView , UICollectionViewDelegate , UICollectionViewDataSource
{
@IBOutlet weak var mainView: UIView!
@IBOutlet weak var btnClose: UIButton!
@IBOutlet weak var subCategoryListCollectionView: UICollectionView!
@IBOutlet weak var lblTitle: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
subCategoryListCollectionView.register(UINib(nibName: "SubcatagoryListCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "SubcatagoryListCollectionViewCell")
mainView.layer.cornerRadius = 10.0
mainView.clipsToBounds = true
}
static func subCatagoryListView() -> SubCatagoryListView? {
let arr = Bundle.main.loadNibNamed("SubCatagoryListView", owner: self, options: nil)
if arr != nil {
if arr!.count > 0 {
if let view = arr![0] as? SubCatagoryListView {
return view;
}
}
}
return nil;
}
@IBAction func btnBackgroundTapped(_ sender: UIButton)
{
self.removeFromSuperview()
}
@IBAction func btnCloseTapped(_ sender: UIButton)
{
self.removeFromSuperview()
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 10
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SubcatagoryListCollectionViewCell", for: indexPath) as! SubcatagoryListCollectionViewCell
return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: IndexPath) -> CGSize {
let cellsize = CGSize(width: (subCategoryListCollectionView.bounds.size.width/3) - 10, height: 50)
return cellsize
}
}
创建新的CollectionViewCell Xib文件后
import UIKit
class SubcatagoryListCollectionViewCell: UICollectionViewCell {
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
}
创建两个文件后,我在我的storybord上加载xib
var subcatagoryXib:SubCatagoryListView?
override func awakeFromNib() {
super.awakeFromNib()
if let subcategoryView = SubCatagoryListView.subCatagoryListView()
{
subcatagoryXib = subcategoryView
}
}
@IBAction func btnAddInterestTapped(_ sender: UIButton) {
if subcatagoryXib != nil
{
self.subcatagoryXib!.frame = CGRect(x:0, y: 0, width: self.view.frame.width , height: self.view.frame.height)
self.view.addSubview(self.subcatagoryXib!)
}
}
答案 4 :(得分:0)
与@Pato的答案相同,但这是来自Medium上@aestusLabs的how to add a customized UICollectionViewCell inside a Xib file
的更详尽的教程。这是3-5分钟的阅读时间,我个人认为这非常有帮助。基本上,它告诉您使用.xib创建另一个自定义的UICollectionViewCell,并将其注册到“级别1”单元格的awakeFromNib()
中。