前面大臉貓簡單的介紹了滾動視圖UIScrollView的屬性與代理,下面我們來看一下UITableView和UICollectionView的區(qū)別與聯(lián)系膝捞。
一塞茅、UITableView的屬性和代理
首先我們來創(chuàng)建一個tableView:
var tableView:UITableView?
//創(chuàng)建表格式圖,兩種樣式
self.tableView = UITableView(frame: self.view.frame ,style: UITableViewStyle.Plain)//無格式
//self.tableView = UITableView(frame: self.view.frame,style:UITableViewStyle.Grouped)//分組格式
設(shè)置tableView允許多選:
self.tableView.allowsMultipleSelection = true
UITableView中每行數(shù)據(jù)都是一個UITableViewCell谣光,在這個控件中為了顯示更多的信息行贪,iOS已經(jīng)在其內(nèi)部設(shè)置好了多個子控件以供開發(fā)者使用。如果我們查看UITableViewCell的聲明文件可以發(fā)現(xiàn)在內(nèi)部有一個UIView控件(contentView抵代,作為其他元素的父控件)腾节、兩個UILable控件(textLabel、detailTextLabel)、一個UIImage控件(imageView)案腺,分別用于容器庆冕、顯示內(nèi)容、詳情和圖片劈榨。
既然我們要用tableView访递,當然要設(shè)置代理,遵循協(xié)議UITableViewDelegate,UITableViewDataSource啦同辣,在我們遵循上面兩個協(xié)議的時候拷姿,有些小伙伴可能會說,怎么報錯了呢旱函?o(╯□╰)o
報錯原因呢是因為在使用UITableViewDataSource, UITableViewDelegate兩個協(xié)議時响巢,必須要實現(xiàn)幾個tableView方法 解決辦法: 在ViewController中實現(xiàn)一下三個方法: 當實現(xiàn)了前兩個方法后,Xcode就不提示這個錯誤了棒妨。
self.tableView!.delegate = self
self.tableView!.dataSource = self
創(chuàng)建一個重用的單元格
self.tableView!.registerClass(UITableViewCell.self, forCellReuseIdentifier: "SwiftCell")
實現(xiàn)代理方法
//一個分區(qū)
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1;
}
//返回表格行數(shù)
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10;
}
//創(chuàng)建各單元格顯示內(nèi)容(創(chuàng)建參數(shù)indexPath制定單元)
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//為了提供表格顯示性能踪古,以創(chuàng)建完成的單元需要重復(fù)使用
let identify:String = "SwiftCell"
//同一形式的單元格重復(fù)使用,在聲明時已經(jīng)注冊
let cell = tableView.dequeueReusableCellWithIdentifier(identify,forIndexPath: indexPath) as UITableViewCell
//設(shè)置cell的選中背景顏色
cell.selectedBackgroundView = UIView()
cell.selectedBackgroundView?.backgroundColor = UIColor(red: 135/255, green: 191/255, blue: 49/255, alpha: 1)
//默認文字顏色是黑色券腔,選中項文字是白色
cell.textLabel?.textColor = UIColor.blackColor()
cell.textLabel?.highlightedTextColor = UIColor.whiteColor()
return cell
}
//UITableDelegate方法伏穆,處理列表項的選中事件
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.tableView!.deselectRowAtIndexPath(indexPath, animated: true)
let itemString = self.ctrlnames![indexPath.row]
let alertControl = UIAlertController(title: "提示", message: "你選中了【\(itemString)】", preferredStyle: UIAlertControllerStyle.Alert)
let okAction = UIAlertAction(title: "確定", style: UIAlertActionStyle.Default, handler: nil )
alertControl.addAction(okAction)
self.presentViewController(alertControl, animated: true, completion: nil )
}
//滑動刪除必須實現(xiàn)的方法
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
print("刪除\(indexPath.row)")
}
//滑動刪除
func tableView(tableView: UITableView, editingStyleForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellEditingStyle {
return UITableViewCellEditingStyle.Delete
}
//設(shè)置刪除按鈕的文字
func tableView(tableView: UITableView, titleForDeleteConfirmationButtonForRowAtIndexPath indexPath: NSIndexPath) -> String? {
return "刪";
}
//設(shè)置每行高度
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 50;
}
//設(shè)置分組標題內(nèi)容高度
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 100;
}
//設(shè)置尾部說明內(nèi)容高度
func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return 50;
}
//返回每組頭標題名稱
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return "頭標題"
}
//返回每組尾標題名稱
func tableView(tableView: UITableView, titleForFooterInSection section: Int) -> String? {
return "尾標題"
}
//返回每組標題索引
func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {
return ["1","2"]
}
//點擊行時調(diào)用
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
}
二、UICollectionView的屬性和代理
首先我們來創(chuàng)建一個collectionView:
var collectionView:UICollectionView?
let layout = UICollectionViewFlowLayout()
self.collectionView = UICollectionView(frame: CGRectMake(0, 20, view.bounds.size.width, view.bounds.size.height), collectionViewLayout: layout)
UICollectionView類負責管理數(shù)據(jù)的有序集合以及以自定義布局的模式來呈現(xiàn)這些數(shù)據(jù)纷纫,它提供了一些常用的表格(table)功能蜈出,此外還增加了許多單欄布局。UICollectionView支持可以用于實現(xiàn)多列網(wǎng)格涛酗、 平鋪的布局、 圓形的布局和更多的自定義布局偷厦,甚至你可以動態(tài)地改變它的布局商叹。
當將一個集合視圖添加到您的用戶界面,您的應(yīng)用程序的主要工作是管理與該集合視圖關(guān)聯(lián)的數(shù)據(jù)只泼。集合視圖的數(shù)據(jù)源對象剖笙,是一個對象,符合 UICollectionViewDataSource 協(xié)議请唱,提供由您的應(yīng)用程序數(shù)據(jù)集合中視圖分成單個的item弥咪,然后可以分為節(jié)為演示文稿中獲取其數(shù)據(jù)。item是您想要呈現(xiàn)的數(shù)據(jù)的最小單位十绑。例如聚至,在照片的應(yīng)用程序,item可能是一個單一的圖像本橙。集合視圖使用一個cell來呈現(xiàn)item扳躬,這是您的數(shù)據(jù)源配置,并提供 UICollectionViewCell 類的一個實例。
除了將它嵌入在您的用戶界面贷币,您可以使用 UICollectionView 對象的方法以確保item的可視化表示匹配您的數(shù)據(jù)源對象中的順序击胜。因此,每當您添加役纹、 刪除或重新排列您的集合中的數(shù)據(jù)偶摔,您可以使用此類的方法來插入、 刪除和重新排列相應(yīng)cell的狀態(tài)促脉。您還使用集合視圖對象來管理所選的item辰斋。
注冊一個重用的cell
在這里我們要注意和tableView的區(qū)別,實例化一個UICollectionView時嘲叔,為了能夠使用cell亡呵,必須得使用下面的方法進行Cell類的注冊,而對于tableView來說并不需要在實例化時使用方法對Cell類進行注冊硫戈。對于這個注冊函數(shù)需要注意一點:registerClass:的參數(shù)一定要是我們所使用的那個UICollectionViewCell類锰什,否則就會報錯!
self.collectionView?.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
與tableView一樣丁逝,使用的時候同樣要遵循協(xié)議UICollectionViewDelegate,UICollectionViewDataSource汁胆,使用代理,用法類似:
self.collectionView?.delegate = self
self.collectionView?.dataSource = self
實現(xiàn)代理方法
//collectionView行數(shù)
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return courses.count;
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let identify:String = "Cell"
//獲取設(shè)計的單元格霜幼,不需要再動態(tài)添加界面元素
let cell = (self.collectionView?.dequeueReusableCellWithReuseIdentifier(identify, forIndexPath: indexPath))! as UICollectionViewCell
return cell;
}
func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
}
//點擊item時調(diào)用
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
}
//當前的item是否可以點擊
func collectionView(collectionView: UICollectionView, shouldSelectItemAtIndexPath indexPath: NSIndexPath) -> Bool {
return true;
}
/* 自定義布局不需要調(diào)用
//單元格大小
func collectionView(collectionView: UICollectionView!,layout collectionViewLayout: UICollectionViewLayout!,sizeForItemAtIndexPath indexPath: NSIndexPath!) -> CGSize {
let size:Float = indexPath.item % 3 == 0 ? 200 : 100
return CGSize(width:size, height:size)
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets {
return UIEdgeInsetsMake(20, 20, 0, 20);
}
*/
在自定義UICollectionViewCell時嫩码,在
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
方法里我們僅需寫入:
let identify:String = "Cell"
//獲取設(shè)計的單元格,不需要再動態(tài)添加界面元素
let cell = self.collectionView?.dequeueReusableCellWithReuseIdentifier(identify, forIndexPath: indexPath) as! UICollectionViewCell
而不需要像UITableViewCell那樣判斷Cell是否已被創(chuàng)建罪既,這是因為在自定義UICollectionViewCell時有一個極其重要的方法:
override func init(frame: CGRect) {
}
這個方法是在初始化自定義的cell時系統(tǒng)自動調(diào)用的铸题,所以不需要判斷cell是否已經(jīng)被創(chuàng)建。而對于UITableViewCell來說初始化方法并不唯一琢感,所以我們需要在指定它的初始化方法丢间。
此外還需注意的一點是,自定義的UICollectionViewCell沒有UITableViewCell如下類似的方法:
let cell = tableView.dequeueReusableCellWithIdentifier(identify,forIndexPath: indexPath) as UITableViewCell
而是有多一個indexPath參數(shù)的方法:
let cell = self.collectionView?.dequeueReusableCellWithReuseIdentifier(identify, forIndexPath: indexPath) as! UICollectionViewCell
我們用OC代碼自定義cell的時候我們都會把在cell里添加的那些信息變量是需要寫在.h文件中作為公共的變量驹针,但是在swift中我們無需擔心這些烘挫,只要有自定義的cell對象我們就可以調(diào)用那些變量啦。