標籤:style http io ar os 使用 sp for on
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的思想來實現.
那麼,關於UITableView的基本用法就寫到這裡了,如有不準確的地方,歡迎指正.
UITableView---IOS開發的常用控制項使用總結