UITableView是咱們ios開發中最經常使用的一個控件,學會UItableView的使用對咱們的開發工做也是至關重要。ios
使用Xcode新建一個空項目,在默認的UIViewController中顯示咱們的UITableView,首先在viewDidLoad方法中初始化tableView緩存
UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:tableView];
我在開發中的習慣是新建立出來的view當即添加到父中去以避免後面會忘掉,除非有一些其餘的邏輯要處理。一個UITableView要能顯示通常須要控制器實現兩個代理方法UITableViewDataSource, UITableViewDelegate前一個代理方法是爲tableView提供數據,後一個主要是處理和tableView屬性相關的好比:行高、cell的點擊等。性能
分別查看這兩個代理方法你會發現UITableViewDataSource的代理方法有兩個是必須實現的,而UITableViewDelegate全部的方法都是可選的,那麼建立一個tableView的最簡單的方式就是實現DataSource中的兩個方法就能夠了。ui
@required // 返回一個UITableView的總行數 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; // 返回每個cell - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
須要說明的是這裏的tableView是單組的,廢話很少說建立一個簡單tableView的代碼以下:代理
// // ViewController.m // UITableViewDemo // // Created by code_xq on 16/2/28. // Copyright © 2016年 code_xq. All rights reserved. // #import "ViewController.h" @interface ViewController ()<UITableViewDataSource> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:tableView]; tableView.dataSource = self; } #pragma mark - 代理方法<UITableViewDataSource> - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 100; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 建立cell UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; cell.textLabel.text = [NSString stringWithFormat:@"cell--%ld", indexPath.row]; return cell; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
須要說明的cell的建立方法init方法一共有兩個參數,第一個參數是一個枚舉蘋果官方爲咱們提供了幾種cell的顯示模式,第二個參數是一類cell的統一標示,cell重用時會用到。code
考慮到數據量大的狀況,不可能有一萬條數據就按照上面的方式建立一萬個cell這樣會很是吃內存,效率也會大大下降,因而蘋果爲咱們實現了一套cell重用機制,一次性只建立有限個cell顯示在屏幕上,滑動時要用到的話再去建立,把離開屏幕中看不見cell放到一個緩存集合中去,當下次要建立時先從集合中取,若是有就不用建立了,這樣會大大提升tableView的性能。orm
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 定義static變量,因爲本方法會被調用屢次若是用局部變量的話有點浪費 static NSString *const ID = @"cell"; // 先從緩存中找,若是沒有再建立 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID]; } cell.textLabel.text = [NSString stringWithFormat:@"cell--%ld", indexPath.row]; return cell; }
由於這段代碼常常會用到,我習慣把他放到個人Xcode的代碼倉庫中這是開發中的一個小技巧。內存
不用寫if判斷,能夠直接在ViewDidLoad方法中對cell進行註冊,最後直接從緩存中取開發
#import "ViewController.h" // 定義static變量 static NSString *const ID = @"cell"; @interface ViewController ()<UITableViewDataSource> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:tableView]; tableView.dataSource = self; // cell註冊 [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID]; } #pragma mark - 代理方法<UITableViewDataSource> - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 100; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // // 定義static變量,因爲本方法會被調用屢次若是用局部變量的話有點浪費 // static NSString *const ID = @"cell"; // 先從緩存中找,若是沒有再建立 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; // if (!cell) { // cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID]; // } cell.textLabel.text = [NSString stringWithFormat:@"cell--%ld", indexPath.row]; return cell; }