DAY 9 『 CollectionView 』Part2

CollectionView:Storyboard、Xib + Collection View + Collection View Cell + Image View + Lable * 2

今天主要讲解:

  1. 扩充 ViewController( UICollectionViewDelegate , UICollectionViewDataSource )
  2. delegate & dataSource 的拉线

扩充 ViewController( UICollectionViewDelegate , UICollectionViewDataSource )

// 扩充 collectionView
extension ViewController: UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout{
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        // collectionView 要显示几列
        return movies.count
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCollectionViewCell", for: indexPath) as? MyCollectionViewCell
        // Cell contents setting
        cell!.ibImage.image = movies[indexPath.row].image
        cell!.ibdate.text = movies[indexPath.row].date
        cell!.ibname.text = movies[indexPath.row].name
        return cell!
    }
}

在 Storyboard 将 CollectionView 拉线到 View Controller,选择 delegate & dataSource

拉完後就会呈现这样

附上完整程序码

//  MyCollectionViewCell
import UIKit
class MyCollectionViewCell: UICollectionViewCell {
    
    @IBOutlet weak var ibImage: UIImageView!
    @IBOutlet weak var ibdate: UILabel!
    @IBOutlet weak var ibname: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
    }

}

// ViewController
import UIKit
struct mvs {
    var image : UIImage?
    var date : String?
    var name : String?
    
    init(image: UIImage, date: String, name: String){
        self.image = image
        self.date = date
        self.name = name
    }
}
class ViewController: UIViewController {

    @IBOutlet weak var collectionView: UICollectionView!

    var movies = [mvs]()
    func moviesitem(){
        movies.append(mvs(image: UIImage(named:"引爆摩天楼")! , date: "1997年4月19日", name: "引爆摩天楼"))
        movies.append(mvs(image: UIImage(named:"第14号猎物")!, date: "1998年4月18日", name: "第14号猎物"))
        movies.append(mvs(image: UIImage(named:"世纪末的魔术师")!, date: "1999年4月17日", name: "世纪末的魔术师"))
        movies.append(mvs(image: UIImage(named:"瞳孔中的暗杀者")!, date: "2000年4月22日", name: "瞳孔中的暗杀者"))
        movies.append(mvs(image: UIImage(named:"往天国的倒数计时")!, date: "2001年4月21日", name: "往天国的倒数计时"))
        movies.append(mvs(image: UIImage(named:"贝克街的亡灵")!, date: "2002年4月20日", name: "贝克街的亡灵"))
        movies.append(mvs(image: UIImage(named:"迷宫的十字路")!, date: "2003年4月19日", name: "迷宫的十字路"))
        movies.append(mvs(image: UIImage(named:"银翼的奇术师")!, date: "2004年4月17日", name: "银翼的奇术师"))
        movies.append(mvs(image: UIImage(named:"水平线上的阴谋")!, date: "2005年4月9日", name: "水平线上的阴谋"))
        movies.append(mvs(image: UIImage(named:"侦探们的镇魂歌")!, date: "2006年4月15日", name: "侦探们的镇魂歌"))
        movies.append(mvs(image: UIImage(named:"绀碧之棺")!, date: "2007年4月21日", name: "绀碧之棺"))
        movies.append(mvs(image: UIImage(named:"战栗的乐谱")!, date: "2008年4月19日", name: "战栗的乐谱"))
        movies.append(mvs(image: UIImage(named:"漆黑的追迹者")!, date: "2009年4月18日", name: "漆黑的追迹者"))
        movies.append(mvs(image: UIImage(named:"鲁邦三世VS名侦探柯南")!, date: "2009年3月27日", name: "鲁邦三世VS名侦探柯南"))
        movies.append(mvs(image: UIImage(named:"天空的劫难船")!, date: "2010年4月17日", name: "天空的劫难船"))
        movies.append(mvs(image: UIImage(named:"沉默的15分钟")!, date: "2011年4月16日", name: "沉默的15分钟"))
        movies.append(mvs(image: UIImage(named:"第11位前锋")!, date: "2012年4月14日", name: "第11位前锋"))
        movies.append(mvs(image: UIImage(named:"绝海的侦探")!, date: "2013年4月20日", name: "绝海的侦探"))
        movies.append(mvs(image: UIImage(named:"鲁邦三世VS名侦探柯南 THE MOVIE")!, date: "2013年12月7日", name: "鲁邦三世VS名侦探柯南 THE MOVIE"))
        movies.append(mvs(image: UIImage(named:"异次元的狙击手")!, date: "2014年4月19日", name: "异次元的狙击手"))
        movies.append(mvs(image: UIImage(named:"江户川柯南失踪事件 ~史上最糟糕的两天~")!, date: "2014年12月26日", name: "江户川柯南失踪事件 ~史上最糟糕的两天~"))
        movies.append(mvs(image: UIImage(named:"业火的向日葵")!, date: "2015年4月18日", name: "业火的向日葵"))
        movies.append(mvs(image: UIImage(named:"纯黑的恶梦")!, date: "2016年4月16日", name: "纯黑的恶梦"))
        movies.append(mvs(image: UIImage(named:"Episode ONE 变小的名侦探")!, date: "2016年12月9日", name: "Episode ONE 变小的名侦探"))
        movies.append(mvs(image: UIImage(named:"唐红的恋歌")!, date: "2017年4月15日", name: "唐红的恋歌"))
        movies.append(mvs(image: UIImage(named:"零的执行人")!, date: "2018年4月13日", name: "零的执行人"))
        movies.append(mvs(image: UIImage(named:"绀青之拳")!, date: "2019年4月12日", name: "绀青之拳"))
        movies.append(mvs(image: UIImage(named:"红之校外旅行")!, date: "2020年11月20日", name: "红之校外旅行"))
        movies.append(mvs(image: UIImage(named:"绯色的不在场证明")!, date: "2021年2月11日", name: "绯色的不在场证明"))
        movies.append(mvs(image: UIImage(named:"绯色的弹丸")!, date: "2021年4月16日", name: "绯色的弹丸"))
    }
    override func viewDidLoad() {
        super.viewDidLoad()

        let nibCell = UINib(nibName: "MyCollectionViewCell", bundle: nil)
        collectionView.register(nibCell, forCellWithReuseIdentifier: "MyCollectionViewCell")
        
        moviesitem()
        
        collectionView.reloadData()
    }
}

extension ViewController: UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout{
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return movies.count
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCollectionViewCell", for: indexPath) as? MyCollectionViewCell
        cell!.ibImage.image = movies[indexPath.row].image
        cell!.ibdate.text = movies[indexPath.row].date
        cell!.ibname.text = movies[indexPath.row].name
        return cell!
    }
}

这样就完成啦!恭喜你学会 CollectionView 了,明天会有新的实作分享,敬请期待!


<<:  【Day08】数据输入元件 - Rate

>>:  【Day21】给我一个节点,我可以把网页改头换面

Day8 Vue Computed vs Method

我们在模板中要进行计算或转换资料时computed及method通常能做到一样的效果,这麽说的话那不...

[Day26] Flutter - Presentation Login & Splash Screen (part10)

前言 Hi, 我是鱼板伯爵今天就是把之前写的一堆功能放到Screen里面,由於是UI的部分所以程序码...

mostly:functional 终章:Monad 的实体

可是我的心,比整个宇宙,还要大了那麽一点点。 -- 费尔南多‧佩索亚, 诗选:A Little L...

安全框架和成熟度模型(Security Frameworks and Maturity Models)

框架(Frameworks) -NIST网络安全框架 NIST网络安全框架(CSF) .认识到美国的...

Linux基础篇

嘿嘿~结果还没进入渗透测试篇XD 决定先来个作业系统相关的Linux篇。 从事资安的行业,需要对Li...