讓UITableView的Cell都變成靜態的


UITableView給我們提供了一個非常不錯的展示列表的工具。內置了復用機制,其中的Cell按照一般的寫法就可以實現服用,不用在Cell滾動的時候每次都創建一個新的。實現了非常好的用戶體驗。但是,有的時候在某些場景下我們需要的不是復用。我們會自己創建好所有需要的Cell,並放在UITableView中。這個前提是所要展示的Cell的個數是非常有限的。比如,在一個APP的設置中。展示的樣式是UITableView的Grouped樣式,有Section Header把幾個不同的分組分別開來。但是全部的Cell也只是展示一些“推送設置”、
”字體設置“、”離線設置“和“清空緩存”之類的內容。十個手指都可以數的過來。

實現的方式,最簡單的就是使用Xib文件了。不過,這年月討論xib已經顯得陳舊。都是用Storyboard了。一個Scene的Controller指定UITableViewController或者繼承自UITableViewController的。之后就可以拖上去需要的Cell並定制,等等。但是,最近因為舊項目適配的問題,所以使用的都是non-storyboard的。這就需要使用代碼直接創建了。這里不得不吐槽一下,使用Storyboard做適配還不一定有代碼指定frame來得快!

代碼創建static cell的話就不需要使用UITableViewController或者其子類了。代碼就是自由!無論Cell是不是靜態的,UITableView還是必須要有的。所以我們的分布介紹里一開始還是創建一個TableView。

self.tableView = UITableView(frame: CGRectMake(0, 10, CommonValues.kScreenWidth, 450), style: UITableViewStyle.Plain)
self.tableView.bounces = false
self.tableView.scrollEnabled = false
self.tableView.delegate = self
self.tableView.dataSource = self
self.tableView.backgroundColor = UIColor.whiteColor()
self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        
scrollView.addSubview(self.tableView)  //我這里是放在scroll view上的,各位自行定奪放在哪里

之后,像前文所說的。我們需要自行創建cell。

    var pushSettingsCell: UITableViewCell!
    // other cells here
    // ...
    var clearCacheCell: UITableViewCell!

關鍵是在方法func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell里面如何實現。按照一般的實現方法是先去dequeue一個cell,如果為空的話則初始化一個UITableViewCell出來,在上面放上需要的控件(如果你沒有重新自定義一個cell的話)。最后返回這個cell。但是,這樣就不是靜態cell了。因為,你不知道這個方法返回的cell是不是你之前指定在這個row上的cell。 靜態cell就是無論如何返回的就是那個原來創建的。也就是我們在上面的代碼中創建的pushSettingsCell等。所以,這個方法是這樣的:

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell: UITableViewCell? = nil
        switch(indexPath.row){
            case 0:
                  cell = pushSettingsCell
            // ...
            default:
                  cell = // another cell
            break;
        }
return cell! }

這樣就已經實現的差不多了。但是,如果你得靜態UITableView中還存有你需要提取出來的值的話,還是有些麻煩。那么重構一下代碼。把初始化出來的Cell放在數組中。

var cellList: [UITableViewCell]?

這樣在上面的方法中提取cell的時候就可以非常簡單。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    return cellList![indexPath.row]
}

 

refered:http://derpturkey.com/create-a-static-uitableview-without-storyboards/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM