我想要为集合视图和其他视图重用一个XIB文件。
例如,我有一张卡需要显示为集合视图单元格,但我也想在独立页面中使用相同的xib / view。
我想对收集视图和常见视图使用相同的卡片图像,几乎就像它是部分的;因此可以在我需要的地方使用它。
我像这样注册我的手机;
self.myCollectionView.register(UINib(nibName: "MyCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "myCellIdentifier")
然后使用它;
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell:MyCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "myCellIdentifier", for: indexPath) as! MyCollectionViewCell
...
}
我尝试使用我创建的UIView来转换dequeueReusableCell代码,但它不喜欢以这种方式使用的视图。
单元格和我的XIB视图文件都是一个独立的swift文件,所以它不在故事板中。
如何在集合视图中使用一个uiview,然后在其他页面上重复使用相同的视图?
非常感谢
摘要的
我想在应用程序的许多地方使用一个UIView和XIB文件
目前,我有一个使用UICollectionViewCell和相关XIB文件的集合视图
我想在应用程序的许多地方使用相同的XIB文件。
如何在我的集合视图和应用程序中需要它的地方重用相同的UIView?
由于
答案 0 :(得分:1)
(a)我有一个我创建的快速文件;它是一个自定义子类UICollectionViewCell。它有一个XIB文件。
使用集合视图注册nib。在cellForItemAt
中,当您需要一个单元格时,将其出列。您将从笔尖收到集合视图单元的副本。根据需要配置它。归还。
(b)我想在应用程序的其他地方重用相同的XIB,包括所有出口和连接
加载笔尖并拉出第一个(也是唯一的)顶级视图。您将从笔尖收到集合视图单元的副本。将其作为子视图添加到界面中的视图。
(最简单的方法是通过UINib及其instantiate
方法。这将返回顶级对象的数组。)
确实,人们通常不会将集合视图单元格用作普通视图的子视图。但我想不出任何反对它的理由;毕竟,视图是一种视图是一种观点。
(如果您不想这样做,我可以考虑解决方法;例如,使nib中的视图成为自定义UIView并通过加载nib并将该视图放入单元格来配置每个单元格。这将介绍一些不便,但它会使笔尖更普遍可用。)
我做了一个简单的例子。这是笔尖,非常简单,因为它只是一个例子:
这是我的应用程序,显示了一个集合视图(在蓝色背景上显示了四个单元格)以及从提取并插入界面的笔尖视图:
这是整个代码:
class MyView : UIView {
@IBOutlet var iv : UIImageView?
}
class MyCell : UICollectionViewCell {
var v : MyView?
}
class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
@IBOutlet weak var cv: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
self.cv.register(MyCell.self, forCellWithReuseIdentifier: "cell")
let arr = UINib(nibName: "View", bundle: nil).instantiate(withOwner: nil, options: nil)
let v = arr[0] as! UIView
self.view.addSubview(v)
v.frame.origin = CGPoint(x:20, y:300)
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 4
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! MyCell
if cell.v == nil {
let arr = UINib(nibName: "View", bundle: nil).instantiate(withOwner: nil, options: nil)
let v = arr[0] as! MyView
cell.contentView.addSubview(v)
cell.v = v
}
print(cell.v?.iv) // image view
return cell
}
}
请注意子类和出口的使用。 cell.v
将我们带到了视图中,因此cell.v?.iv
将我们带到了图片视图 - 现在我们可以根据需要执行进一步的配置。因此,为了从笔尖到达子视图,我们添加了一个间接级别,但这似乎是一个非常小的代价。