Swift基礎(chǔ)之UITableView與UICollectionView

前面大臉貓簡單的介紹了滾動視圖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)用那些變量啦。

在以后的swift進階中大臉貓會用到自定義的cell柬甥,到時候再詳細說明咯饮六。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市苛蒲,隨后出現(xiàn)的幾起案子卤橄,更是在濱河造成了極大的恐慌,老刑警劉巖臂外,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虽风,死亡現(xiàn)場離奇詭異棒口,居然都是意外死亡,警方通過查閱死者的電腦和手機辜膝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進店門无牵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人厂抖,你說我怎么就攤上這事茎毁。” “怎么了忱辅?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵七蜘,是天一觀的道長。 經(jīng)常有香客問我墙懂,道長橡卤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任损搬,我火速辦了婚禮碧库,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巧勤。我一直安慰自己嵌灰,他們只是感情好,可當我...
    茶點故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布颅悉。 她就那樣靜靜地躺著沽瞭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剩瓶。 梳的紋絲不亂的頭發(fā)上驹溃,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天,我揣著相機與錄音延曙,去河邊找鬼吠架。 笑死,一個胖子當著我的面吹牛搂鲫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播磺平,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼魂仍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拣挪?” 一聲冷哼從身側(cè)響起擦酌,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菠劝,沒想到半個月后赊舶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年笼平,在試婚紗的時候發(fā)現(xiàn)自己被綠了园骆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,694評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡寓调,死狀恐怖锌唾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情夺英,我是刑警寧澤晌涕,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站痛悯,受9級特大地震影響余黎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜载萌,卻給世界環(huán)境...
    茶點故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一惧财、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧炒考,春花似錦可缚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瓤帚,卻和暖如春描姚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背戈次。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工轩勘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怯邪。 一個月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓绊寻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親悬秉。 傳聞我的和親對象是個殘疾皇子澄步,可洞房花燭夜當晚...
    茶點故事閱讀 43,580評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 翻譯自“Collection View Programming Guide for iOS” 0 關(guān)于iOS集合視...
    lakerszhy閱讀 3,842評論 1 22
  • 前言關(guān)于 iOS 10 UICollectionView的新特性,主要還是體現(xiàn)在如下3個方面 順滑的滑動體驗現(xiàn)在...
    ZhangCc_閱讀 7,144評論 8 46
  • 大學(xué)時有段時間因為要做家教而晚歸和泌。一個人搭乘末班公交村缸,懶散地靠在椅背上,耳機里循環(huán)著蔡健雅的《紅色高跟鞋》武氓。那是當...
    西沅Lfy閱讀 1,159評論 0 0
  • 大學(xué)時期梯皿,周末對我而言似乎沒有一點吸引力仇箱。因為睡懶覺并非周末的特權(quán)。工作后东羹,由于工作性質(zhì)原因剂桥,實行輪班制,當然百姓,必...
    薛老師閱讀 309評論 0 0
  • 原文地址:http://woodding2008.iteye.com/blog/2326677簡介storm1.0...
    wangliang938閱讀 799評論 0 2