UITableView---IOS開發的常用控件使用總結

ew3y 9年前發布 | 23K 次閱讀 iOS開發 移動開發 UITableView

        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的思想來實現.

 本文由用戶 ew3y 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!