教你寫個(gè)多表視圖

multi_table.gif

如圖所示的多表視圖是一個(gè)很常用的東西讥脐,之前我是用UIScrollViewUITableViewController做的笤妙。把當(dāng)前的控制器作為一個(gè)父控制器皂岔,添加三個(gè)UITableViewController的實(shí)例作為子控制器症见,把父控制器中的 scrollView 作為容器,然后添加子控制器中的 tableView 作為子視圖呼胚。這樣做有一個(gè)問題,一旦有十幾二十個(gè)表的話息裸,內(nèi)存就要爆炸了蝇更。解決的辦法是可以自己寫個(gè)重用機(jī)制沪编,不過這顯然沒必要,用自帶重用機(jī)制的UICollectionView應(yīng)該是個(gè)更好的選擇年扩。

首先新建個(gè)HomeContainerViewController蚁廓,繼承自UICollectionViewController,然后在viewDidLoad里面加上這兩句:

collectionView?.pagingEnabled = true
collectionView?.bounces = false

這樣滑動(dòng)的時(shí)候就會(huì)有翻頁的段落感厨幻,滑到邊界的時(shí)候也不會(huì)有回彈效果相嵌。

然后要用 layout 控制布局,用最常用的 UICollectionViewFlowLayout 就行了况脆,設(shè)置單元格的寬高饭宾,既然是翻頁,寬肯定是跟屏幕等寬漠另,高度就看你需求了捏雌,但是不要超過 collectionView 的高,如下:

lazy var layout: UICollectionViewFlowLayout = {
    let lazyLayout = UICollectionViewFlowLayout()
    lazyLayout.itemSize = CGSize(width: Width, height: Height)
    lazyLayout.minimumInteritemSpacing = 0
    lazyLayout.minimumLineSpacing = 0
    lazyLayout.scrollDirection = .Horizontal
    return lazyLayout
}()

之后就可以用這個(gè) layout 來初始化之前定義的HomeContainerViewController笆搓。接下來我們要自定義一個(gè)UICollectionViewCell性湿,讓它包含一個(gè) tableView:

class HomeCollectionViewCell: UICollectionViewCell {
    
    var tableView: UITableView!
    var dataSource: HomeTableDataSource!
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        tableView = UITableView(frame: bounds, style: .Grouped)

        tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: CellReuseIdentifier.LatestArticles)
        addSubview(tableView)

        dataSource = HomeTableDataSource()
        tableView.dataSource = dataSource
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }  
}

這邊還有一個(gè) dataSource(同理可自行添加 delegate),是 tableView 的數(shù)據(jù)源满败,可能大部分人習(xí)慣把控制器又當(dāng) dataSource 又當(dāng) delegate肤频,不過我比較喜歡分開,就算是用同一個(gè)控制器算墨,也會(huì)用extension把代碼分開宵荒。好現(xiàn)在我們看看如何定義這個(gè) dataSource:

class HomeTableDataSource: NSObject, UITableViewDataSource {

    var cellData: String?
    
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 20
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return 1
    }

    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(CellReuseIdentifier.LatestArticles, forIndexPath: indexPath)

        //Configure the cell...
        cell.textLabel?.text = cellData
        return cell
    }
}

注意一定要繼承 NSObject ,因?yàn)?UITableViewDataSource協(xié)議是繼承了NSObjectProtocol協(xié)議的净嘀,所以如果你不繼承NSObject的話报咳,還得自己寫一堆方法來遵守NSObjectProtocol協(xié)議。因?yàn)檫@邊只是個(gè) Demo挖藏,所以我直接在 cell 中顯示cellData的值暑刃,那cellData 的值在哪里設(shè)置呢?顯然是在HomeContainerViewController中:


let tableViewDataList = ["first table", "second table", "third table"]
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! HomeCollectionViewCell
    
    // Configure the cell
    cell.dataSource.cellData = tableViewDataList[indexPath.section]
    cell.tableView.reloadData()
    
    return cell
}

在真實(shí)場(chǎng)景中一般是會(huì)在 dataSource 中放一個(gè) urlString 的屬性膜眠,然后一旦這個(gè)屬性被賦值就自動(dòng)聯(lián)網(wǎng)取數(shù)據(jù)岩臣。這邊 cell 是會(huì)被復(fù)用的,在翻到第三頁時(shí)宵膨,會(huì)復(fù)用第一頁的 cell 架谎,第四頁復(fù)用第二頁的 cell……依此類推,所以需要給 cell 中的tableView調(diào)用 reloadData方法辟躏,不然就算改變了表中的數(shù)據(jù)谷扣,也不能正確的顯示(奇數(shù)頁都顯示第一頁的數(shù)據(jù),偶數(shù)頁都顯示第二頁的數(shù)據(jù))捎琐。

這樣就完成了一個(gè)多表視圖会涎,實(shí)際項(xiàng)目一般會(huì)在 table 上方放個(gè)小滑塊指示器什么的涯曲,也很簡(jiǎn)單,只要在cellForItemAtIndexPath方法中根據(jù)indexPath.section來設(shè)置滑塊位置就好了在塔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幻件,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛔溃,更是在濱河造成了極大的恐慌绰沥,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贺待,死亡現(xiàn)場(chǎng)離奇詭異徽曲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)麸塞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門秃臣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哪工,你說我怎么就攤上這事奥此。” “怎么了雁比?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵稚虎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我偎捎,道長(zhǎng)蠢终,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任茴她,我火速辦了婚禮寻拂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丈牢。我一直安慰自己祭钉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布赡麦。 她就那樣靜靜地躺著朴皆,像睡著了一般帕识。 火紅的嫁衣襯著肌膚如雪泛粹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天肮疗,我揣著相機(jī)與錄音晶姊,去河邊找鬼。 笑死伪货,一個(gè)胖子當(dāng)著我的面吹牛们衙,可吹牛的內(nèi)容都是我干的钾怔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蒙挑,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼宗侦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起忆蚀,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤矾利,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后馋袜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體男旗,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年欣鳖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了察皇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泽台,死狀恐怖什荣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情怀酷,我是刑警寧澤溃睹,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站胰坟,受9級(jí)特大地震影響因篇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笔横,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一竞滓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吹缔,春花似錦商佑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至晚碾,卻和暖如春抓半,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背格嘁。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工笛求, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓探入,卻偏偏與公主長(zhǎng)得像狡孔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜂嗽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • *7月8日上午 N:Block :跟一個(gè)函數(shù)塊差不多苗膝,會(huì)對(duì)里面所有的內(nèi)容的引用計(jì)數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,473評(píng)論 1 14
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫植旧、插件荚醒、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,022評(píng)論 4 62
  • 概述在iOS開發(fā)中UITableView可以說是使用最廣泛的控件,我們平時(shí)使用的軟件中到處都可以看到它的影子隆嗅,類似...
    liudhkk閱讀 8,987評(píng)論 3 38
  • 最近幾天 一直在研究朋友圈營(yíng)銷的方法 總覺得都是小兒科的法子 很多人看了網(wǎng)絡(luò)小王子寫的文章 都忍不住說“太干了” ...
    石展輝閱讀 495評(píng)論 0 2
  • 彈鋼琴的小蘑菇和唱歌的大白菜
    estella_hcy閱讀 214評(píng)論 0 0