UITableView介紹 之 基本使用

UITableView簡介

  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

tableView中cell的重用

  考慮到數據量大的狀況,不可能有一萬條數據就按照上面的方式建立一萬個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;
}
相關文章
相關標籤/搜索