快速设置UITableView不同section对应于不同种类的cell

简介:

快速设置UITableView不同section对应于不同种类的cell

本文主要是为了写明如何在UITableView中,一个section对应于一种类型的cell,写起来不凌乱.

在不封装任何类的前提下提供如下源码:

请自行创建出3种类型的cell,创建好了就行,你需要创建出ModelOneCell,ModelTwoCell,ModelThreeCell,内容为空

//
//  RootViewController.m
//  Sections
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import "ModelOneCell.h"
#import "ModelTwoCell.h"
#import "ModelThreeCell.h"

@interface RootViewController ()<UITableViewDelegate, UITableViewDataSource>

@property (nonatomic, strong) UITableView      *tableView;  // tableView


@property (nonatomic, strong) NSMutableArray   *dataArray;  // 数据数组
@property (nonatomic, strong) NSMutableArray   *nameList;   // 数组名字


@end

@implementation RootViewController

#pragma mark - 只初始化一次
#define REUESED_SIZE  100
static NSString *reUsedStr[REUESED_SIZE] = {nil}; // 重用标示
#define REUESED_FLAG  reUsedStr[0]
+ (void)initialize
{
    if (self == [RootViewController class])
    {
        for (int i = 0; i < REUESED_SIZE; i++)
        {
            reUsedStr[i] = [NSString stringWithFormat:@"GoodBoy_%d", i];
        }
    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 初始化tableView
    _tableView         = [[UITableView alloc] initWithFrame:self.view.bounds
                                                      style:UITableViewStylePlain];
    [self.view addSubview:_tableView];
    _tableView.delegate       = self;
    _tableView.dataSource     = self;
    
    // 模拟三种类型的数据源
    NSArray *type1 = @[@"1", @"2", @"3"];
    NSArray *type2 = @[@"一", @"二", @"三"];
    NSArray *type3 = @[@"one", @"two", @"three"];
    
    // 添加数据源 + 数据源标签名字
    _dataArray = [NSMutableArray new];
    _nameList  = [NSMutableArray new];
    [_dataArray addObject:type1]; [_nameList addObject:@"ModelOneCell"];
    [_dataArray addObject:type2]; [_nameList addObject:@"ModelTwoCell"];
    [_dataArray addObject:type3]; [_nameList addObject:@"ModelThreeCell"];
}

#pragma mark - UITableView'delegate & dataSource
// 每个区有几个cell
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_dataArray[section] count];
}

// 设定tableView有几个区域
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [_nameList count];
}

// cell的初始化以及重用设置
-(UITableViewCell *)tableView:(UITableView *)tableView
        cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 根据section区域获取几种cell的公共父类
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reUsedStr[indexPath.section]];
    
    // 根据不同的区域对应创建出该区域的cell
    if (cell == nil)
    {
        if ([_nameList[indexPath.section] isEqualToString:@"ModelOneCell"])
        {
            cell = [[ModelOneCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:reUsedStr[indexPath.section]];
        }
        else if ([_nameList[indexPath.section] isEqualToString:@"ModelTwoCell"])
        {
            cell = [[ModelTwoCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:reUsedStr[indexPath.section]];
        }
        
        else if ([_nameList[indexPath.section] isEqualToString:@"ModelThreeCell"])
        {
            cell = [[ModelThreeCell alloc] initWithStyle:UITableViewCellStyleDefault
                                         reuseIdentifier:reUsedStr[indexPath.section]];
        }
    }
    
    // 对cell进行设置
    if ([_nameList[indexPath.section] isEqualToString:@"ModelOneCell"])
    {
        cell = [[ModelOneCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:reUsedStr[indexPath.section]];
        cell.textLabel.text = _dataArray[indexPath.section][indexPath.row];
    }
    else if ([_nameList[indexPath.section] isEqualToString:@"ModelTwoCell"])
    {
        cell = [[ModelTwoCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:reUsedStr[indexPath.section]];
        cell.textLabel.text = _dataArray[indexPath.section][indexPath.row];
    }
    
    else if ([_nameList[indexPath.section] isEqualToString:@"ModelThreeCell"])
    {
        cell = [[ModelThreeCell alloc] initWithStyle:UITableViewCellStyleDefault
                                     reuseIdentifier:reUsedStr[indexPath.section]];
        cell.textLabel.text = _dataArray[indexPath.section][indexPath.row];
    }
    
    return cell;
}

// 点击cell获取数据
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([_nameList[indexPath.section] isEqualToString:@"ModelOneCell"])
    {
        NSLog(@"%@", _dataArray[indexPath.section][indexPath.row]);
    }
    else if ([_nameList[indexPath.section] isEqualToString:@"ModelTwoCell"])
    {
        NSLog(@"%@", _dataArray[indexPath.section][indexPath.row]);
    }
    
    else if ([_nameList[indexPath.section] isEqualToString:@"ModelThreeCell"])
    {
        NSLog(@"%@", _dataArray[indexPath.section][indexPath.row]);
    }
}

// 设定不同种类cell的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([_nameList[indexPath.section] isEqualToString:@"ModelOneCell"])
    {
        return 50;
    }
    else if ([_nameList[indexPath.section] isEqualToString:@"ModelTwoCell"])
    {
        return 70;
    }
    
    else if ([_nameList[indexPath.section] isEqualToString:@"ModelThreeCell"])
    {
        return 100;
    }
    else
    {
        return 0;
    }
}

@end

运行时候的效果如下:

核心思想:

接下来,我们就要来进行封装,达到好用的目的:)

我们把数据源以及数据源标签抽象成一个对象就可以很好的管理这些东西了,以下给出源码:

//
//  TableVewData.h
//  Sections
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface TableViewData : NSObject

// 添加数据源 + 数据源标签
- (void)addDataArray:(NSArray *)array arrayFlag:(NSString *)flag;

// 对应区域中的row的个数
- (NSInteger)numberOfRowsInSection:(NSInteger)section;

// 有几个section
- (NSInteger)numberOfSections;

// 对应于Section上的flag值标签
- (NSString *)flagInSection:(NSIndexPath *)indexPath;

// 对应于indexPath中的数据
- (id)dataInIndexPath:(NSIndexPath *)indexPath;

@end


//
//  TableVewData.m
//  Sections
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "TableViewData.h"

@interface TableViewData ()

@property (nonatomic, strong) NSMutableArray  *dataArray;
@property (nonatomic, strong) NSMutableArray  *nameList;

@end

@implementation TableViewData

- (instancetype)init
{
    self = [super init];
    if (self)
    {
        _dataArray = [NSMutableArray new];
        _nameList  = [NSMutableArray new];
    }
    return self;
}

- (void)addDataArray:(NSArray *)array arrayFlag:(NSString *)flag
{
    [_dataArray addObject:array];
    [_nameList  addObject:flag];
}

- (NSInteger)numberOfRowsInSection:(NSInteger)section
{
    return [_dataArray[section] count];
}

- (NSInteger)numberOfSections
{
    return [_dataArray count];
}

- (NSString *)flagInSection:(NSIndexPath *)indexPath
{
    return _nameList[indexPath.section];
}

- (id)dataInIndexPath:(NSIndexPath *)indexPath
{
    return _dataArray[indexPath.section][indexPath.row];
}

@end

主函数使用情形如下:
//
//  RootViewController.m
//  Sections
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import "ModelOneCell.h"
#import "ModelTwoCell.h"
#import "ModelThreeCell.h"

#import "TableViewData.h"

@interface RootViewController ()<UITableViewDelegate, UITableViewDataSource>

@property (nonatomic, strong) UITableView      *tableView;  // tableView

@property (nonatomic, strong) TableViewData    *tableData;


@end

@implementation RootViewController

#pragma mark - 只初始化一次
#define REUESED_SIZE  100
static NSString *reUsedStr[REUESED_SIZE] = {nil}; // 重用标示
#define REUESED_FLAG  reUsedStr[0]
+ (void)initialize
{
    if (self == [RootViewController class])
    {
        for (int i = 0; i < REUESED_SIZE; i++)
        {
            reUsedStr[i] = [NSString stringWithFormat:@"GoodBoy_%d", i];
        }
    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 初始化tableView
    _tableView         = [[UITableView alloc] initWithFrame:self.view.bounds
                                                      style:UITableViewStylePlain];
    [self.view addSubview:_tableView];
    _tableView.delegate       = self;
    _tableView.dataSource     = self;
    
    
    // 模拟三种类型的数据源
    NSArray *type1 = @[@"1", @"2", @"3"];
    NSArray *type2 = @[@"一", @"二", @"三"];
    NSArray *type3 = @[@"one", @"two", @"three"];
    
    // 添加数据源 + 数据源标签名字
    _tableData = [TableViewData new];
    [_tableData addDataArray:type1 arrayFlag:@"ModelOneCell"];
    [_tableData addDataArray:type2 arrayFlag:@"ModelTwoCell"];
    [_tableData addDataArray:type3 arrayFlag:@"ModelThreeCell"];
}

#pragma mark - UITableView'delegate & dataSource
// 每个区有几个cell
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_tableData numberOfRowsInSection:section];
}

// 设定tableView有几个区域
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [_tableData numberOfSections];
}

// cell的初始化以及重用设置
-(UITableViewCell *)tableView:(UITableView *)tableView
        cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 根据section区域获取几种cell的公共父类
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reUsedStr[indexPath.section]];
    
    // 根据不同的区域对应创建出该区域的cell
    if (cell == nil)
    {
        if ([[_tableData flagInSection:indexPath] isEqualToString:@"ModelOneCell"])
        {
            cell = [[ModelOneCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:reUsedStr[indexPath.section]];
        }
        else if ([[_tableData flagInSection:indexPath] isEqualToString:@"ModelTwoCell"])
        {
            cell = [[ModelTwoCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:reUsedStr[indexPath.section]];
        }
        
        else if ([[_tableData flagInSection:indexPath] isEqualToString:@"ModelThreeCell"])
        {
            cell = [[ModelThreeCell alloc] initWithStyle:UITableViewCellStyleDefault
                                         reuseIdentifier:reUsedStr[indexPath.section]];
        }
    }
    
    // 对cell进行设置
    if ([[_tableData flagInSection:indexPath] isEqualToString:@"ModelOneCell"])
    {
        cell = [[ModelOneCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:reUsedStr[indexPath.section]];
        cell.textLabel.text = [_tableData dataInIndexPath:indexPath];
    }
    else if ([[_tableData flagInSection:indexPath] isEqualToString:@"ModelTwoCell"])
    {
        cell = [[ModelTwoCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:reUsedStr[indexPath.section]];
        cell.textLabel.text = [_tableData dataInIndexPath:indexPath];
    }
    
    else if ([[_tableData flagInSection:indexPath] isEqualToString:@"ModelThreeCell"])
    {
        cell = [[ModelThreeCell alloc] initWithStyle:UITableViewCellStyleDefault
                                     reuseIdentifier:reUsedStr[indexPath.section]];
        cell.textLabel.text = [_tableData dataInIndexPath:indexPath];
    }
    
    return cell;
}

// 点击cell获取数据
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([[_tableData flagInSection:indexPath] isEqualToString:@"ModelOneCell"])
    {
        NSLog(@"%@", [_tableData dataInIndexPath:indexPath]);
    }
    else if ([[_tableData flagInSection:indexPath] isEqualToString:@"ModelTwoCell"])
    {
        NSLog(@"%@", [_tableData dataInIndexPath:indexPath]);
    }
    
    else if ([[_tableData flagInSection:indexPath] isEqualToString:@"ModelThreeCell"])
    {
        NSLog(@"%@", [_tableData dataInIndexPath:indexPath]);
    }
}

// 设定不同种类cell的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([[_tableData flagInSection:indexPath] isEqualToString:@"ModelOneCell"])
    {
        return 50;
    }
    else if ([[_tableData flagInSection:indexPath] isEqualToString:@"ModelTwoCell"])
    {
        return 70;
    }
    
    else if ([[_tableData flagInSection:indexPath] isEqualToString:@"ModelThreeCell"])
    {
        return 100;
    }
    else
    {
        return 0;
    }
}

@end

添加数据源:

见名知意:

使用很便利:

 

目录
相关文章
同一个UILabel不同的字体颜色
同一个UILabel不同的字体颜色
49 0
TableView列表展开不同cell
TableView列表展开不同cell
86 0
TableView列表展开不同cell
自定义tableView的section header/footerView时的view复用问题
自定义tableView的section header/footerView时的view复用问题
323 0
Cell里面10个cell只想展示6条
Cell里面10个cell只想展示6条
94 0
Cell里面10个cell只想展示6条
|
iOS开发
iOS学习笔记--tableView中如何获取cell上textfiled的值
iOS学习笔记--tableView中如何获取cell上textfiled的值 最近在项目中遇到了这样一个问题,在tableView的cell上添加textfiled,然后获取cell上textfiled的值。
1444 0