iOS:将UICollectionView放在一个单独的类中

时间:2017-01-27 07:15:15

标签: ios swift uicollectionview

我想用自定义单元格实现UICollectionView,之前我有:

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout

在我内部实施

func numberOfSections(in collectionView: UICollectionView) -> Int
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell

它工作正常。现在我想实现更多与单元格选择相关的函数,但我也想要符合MVC模式,所以我试图将UICollectionView实现移动到另一个文件。然后我有:

class ViewController: UIViewController {
    @IBoutlet var grid: UICollectionView!
    ovverride func viewDidLoad() {
        ...
        grid = GridView(grid.frame, GridLayout()) //GridLayout() is the layout file working fine
    }
 }

和另一个文件:

class GridView: UICollectionView, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {
    func numberOfSections(in collectionView: UICollectionView) -> Int {}
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {}
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {}
}

但是如果运行它会给出错误:

collectionView:numberOfItemsInSection:]: unrecognized selector sent to instance 

我在这里检查了链接:error,并尝试在ViewController中执行此操作:

grid.dataSource = grid as! UICollectionViewDataSource?
grid.delegate = grid as! UICollectionViewDelegate?

但它没有用。我可以知道如何解决这个问题吗?

修改 AppDelegate类给出了错误。我还尝试设置GridView的初始化程序:

override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
    super.init(...)
    self.dataSource = self
    self.delegate = self
}

但它没有用。

2 个答案:

答案 0 :(得分:0)

您应该尝试在GridView类的初始化(frame:, layout:)内设置GridView的数据源和代理。

override init(...) {
    super.init(...)
    self.dataSource = self
    self.delegate = self
}

你能否提一下给出错误的确切行?也许您仍然在UICollectionView中使用了一些ViewController相关代码?

答案 1 :(得分:-1)

你有没有尝试过;

grid.dataSource = self
grid.delegate = self

如果可行,则可以在此之后使用相同的委托和数据源函数中的标记自定义集合视图。