UITableView---IOS開發的常用控件使用總結
UITableView是IOS中非常常見的一個控件,主要用來進行列表內容的展示.有兩個默認的內置風格: UITableViewStylePlain和UITableViewStyleGrouped.其中UITableViewStyleGrouped允許將列表中的內容進行分組.UITableViewController是專用于UITableView的視圖控制器,提供了一系列的方法來對 UITableView進行創建和維護.
UITableViewController必須繼承兩個協議:
1, 通過UITableViewDataSource向UITableView提供數據,向每一個單元格cell進行內容的填充.
2, 通過UITableViewDelegate來處理對于每一個單元格cell的選擇事件(如點擊選取等).
常見的注意事項大概如下:
1, 新建UITableViewController子類,并使其繼承UITableViewDataSource和UITableViewDelegate協議.
2, 通過storyboard創建UITableView,并將其dataSource和delegate都指向該UITableViewController對象
(storyboard中右鍵點擊UITableView對象,選取并連線即可).
3, 對該UITableView,必須要重寫至少兩個方法,
func tableView(table: UITableView, numberOfRowsInSection section: Int) -> Int { }
該方法返回tableView中呈現的單元格個數,如return self.products.count
func tableView(table: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: UITableViewCellStyle.SubTitle, reuseIdentifier: "myCell")
cell.textLabel.text = self.products[indexPath.row]['title'] as? String
return cell
}
該方法用于描述每一個單元格cell的樣式及其中填充的數據,然后返回該cell.
每一個cell的基本樣式可以通過Identifier來預先設置,如Basic, Subtitle等基本類型, 也可以設置自定義類型myCell.
let cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Basic", forIndexPath: indexPath) as UITableViewCell
該方法從tableView的單元格隊列中取出一個cell進行重用.
4, 除了以上兩個必須重寫的方法之外,設置選取每個cell對應的執行操作,可以通過以下方法,
func tableView(tableView: UITableView, didSelectRowAtIndex indexPath: NSIndexPath!) { self.didChooseItem(indexPath.row) }
該方法專用于選取cell時執行的操作.
func tableView(tableView: UITableView!, willDisplayCell cell: UITableViewCell!, forRowAtIndexPath indexPath: NSIndexPath!) { }
該方法是在呈現選取該cell時執行的操作,如顯示一個警告或者動畫.
5, delegate的用法.
delegate的思想其實很有意思,一個對象做不到的行為,可以給其設置一個代理對象,而代理對象可以代替其完成該行為.
在UITableView中的使用非常常見.比如從網絡中獲取數據來填充tableView,我們可以將獲取網絡數據的操作onRequest封裝在一個 HttpController的類中.則獲取的數據是跟HttpController的對象綁定在一起的.而我們希望可以直接拿來傳遞給 tableViewController,而不用通過HttpController對象將數據傳遞給tableViewController.
首先,在HttpController中定義一個協議,
protocol HttpProtocol {
func parseResults(results: NSDictionary)
}
然后,將tableViewController類繼承該HttpProtocol協議,并定義parseResults(results: NSDictionary)的函數體.
接下來,在tableViewController中定義一個HttpController對象,并指定該httpCtl的delegate對象就是該tableViewController自身.
var httpCtl: HttpController = HttpController()
httpCtl.delegate = self
// 這一步對應的是 HttpController類中要定義一個屬性 var delegate: HttpProtocol?
httpCtl.onRequest("www.dianping.com")
那么,delegate發生作用的過程為,httpController的對象httpCtl調用onRequest方法,onRequest方法中獲取到網絡數據的原始值,需要調用parseResults方法進行數據解析.而parseResults的函數體是在 tableViewController中定義的.則最終過程為,在httpCtl.onRequest中使用 self.delegate?.parseResults(jsonResult)即可對網絡數據進行解析.同時,解析的數據在parseResults 函數體中即可直接傳遞給tableViewController(傳遞過程即為,直接賦值給tableViewController的屬性如 products數組即可).
以上,就是delegate發生作用的基本過程.描述不清楚的地方,歡迎各位同學一起來探討.
其實,不采用delegate的方式也可以實現上述功能,即將parseResults函數體直接定義為HttpController自身的方法,則獲取網絡數據和解析網絡數據都在HttpController中完成.最后通過segue等方式將數據從HttpController中傳遞給 tableViewController即可.但涉及到更加復雜的數據傳遞或者操作,還是推薦使用delegate的思想來實現.