将集合视图的XIB视图重用为其他视图的部分视图?

时间:2017-03-13 16:01:33

标签: swift uiview uicollectionview uicollectionviewcell partial-views

我想要为集合视图和其他视图重用一个XIB文件。

例如,我有一张卡需要显示为集合视图单元格,但我也想在独立页面中使用相同的xib / view。

即; card image

我想对收集视图和常见视图使用相同的卡片图像,几乎就像它是部分的;因此可以在我需要的地方使用它。

我像这样注册我的手机;

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?

由于

1 个答案:

答案 0 :(得分:1)

  

(a)我有一个我创建的快速文件;它是一个自定义子类UICollectionViewCell。它有一个XIB文件。

使用集合视图注册nib。在cellForItemAt中,当您需要一个单元格时,将其出列。您将从笔尖收到集合视图单元的副本。根据需要配置它。归还。

  

(b)我想在应用程序的其他地方重用相同的XIB,包括所有出口和连接

加载笔尖并拉出第一个(也是唯一的)顶级视图。您将从笔尖收到集合视图单元的副本。将其作为子视图添加到界面中的视图。

(最简单的方法是通过UINib及其instantiate方法。这将返回顶级对象的数组。)

确实,人们通常不会将集合视图单元格用作普通视图的子视图。但我想不出任何反对它的理由;毕竟,视图是一种视图是一种观点。

(如果您不想这样做,我可以考虑解决方法;例如,使nib中的视图成为自定义UIView并通过加载nib并将该视图放入单元格来配置每个单元格。这将介绍一些不便,但它会使笔尖更普遍可用。)

我做了一个简单的例子。这是笔尖,非常简单,因为它只是一个例子:

enter image description here

这是我的应用程序,显示了一个集合视图(在蓝色背景上显示了四个单元格)以及从提取并插入界面的笔尖视图:

enter image description here

这是整个代码:

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将我们带到了图片视图 - 现在我们可以根据需要执行进一步的配置。因此,为了从笔尖到达子视图,我们添加了一个间接级别,但这似乎是一个非常小的代价。