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/