zoukankan      html  css  js  c++  java
  • 快速设置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

    添加数据源:

    见名知意:

    使用很便利:

  • 相关阅读:
    基于风险集成 Risk-Based
    基于消息(事件)集成 Message-Based/Event-Based
    如何保证系统测试的完备性?
    1.1 功能测试(功能)
    问:给你一个网站,你如何测试?
    问:你在测试中发现了一个bug,但是开发经理认为这不是一个bug,你应该怎样解决?
    4.如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?
    什么是 JavaConfig?
    Spring Boot 有哪些优点?
    .Redis中的常用命令哪些?
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3896336.html
Copyright © 2011-2022 走看看