iOS 给 ViewController 减负 之 UITableView

Posted ACM_Someone like you

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 给 ViewController 减负 之 UITableView相关的知识,希望对你有一定的参考价值。

  今天看了一些博客文章分享了如何给ViewController 瘦身的问题, 其中一个就是tableView.

  的确,随着产品迭代,VC里面可能越来越臃肿,有时候真的需要好好进行一次瘦身.可能是参考的博客中讲解更侧重于方法的复用,其实这个真的是很灵活的问题,有时候tableView list 都是同一规格就比较适合可复用的方法去实现,有时候就是需要单独自定义的,一个tableView 可能有不止两到三个cell 类型的情况. 所以针对后者.我也仿照着写了一个 把 UITableViewDataSource UITableViewDelegate 都提取出来单独做一个对象做处理.

  需求:一个tableView 里面目前元素是 一行banner  一行时间  若干行list 元素组成

  效果:

  SectionDemo 如下:

 

//
//  ViewController减负.h
//  链式DSL学习
//
//  Created by HF on 17/3/8.
//  Copyright © 2017年 HF-Liqun. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController__ : UIViewController

@property (nonatomic, strong) UITableView *tableView;

@end
//
//  ViewController减负.m
//  链式DSL学习
//
//  Created by HF on 17/3/8.
//  Copyright © 2017年 HF-Liqun. All rights reserved.
//

#import "ViewController减负.h"
#import "HomeBannerCell.h"
#import "HomeTableViewDataSource.h"

@interface ViewController__ ()

@property (nonatomic, strong) HomeTableViewDataSource *tabbleViewDataSource;
@end

@implementation ViewController__

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.tableView];
    [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.bottom.equalTo(self.view);
        make.left.right.top.equalTo(self.view);
    }];
    
    //创建实例类tabbleViewDataSource
    //传入数据 这个可以根据实际情况灵活处理
    self.tabbleViewDataSource = [[HomeTableViewDataSource alloc]
                                 initWithItems:@[@"好好",@"学习",@"天天",@"向上"] ];
    
    //设置tableView 两个代理
    self.tableView.dataSource = self.tabbleViewDataSource;
    self.tableView.delegate = self.tabbleViewDataSource;
    
    //每个cell 行 点击触发 response
    TableViewCellBannerAction bannnerAction = ^(id sender) {
        NSLog(@"%@",sender);
    };
    TableViewCellDailyAction dailyAction = ^(id sender) {
        NSLog(@"%@",sender);
    };
    TableViewCellListAction listAction = ^(id sender) {
        NSLog(@"%@",sender);
    };
    self.tabbleViewDataSource.banneryAction = bannnerAction;
    self.tabbleViewDataSource.dailyAction = dailyAction;
    self.tabbleViewDataSource.listAction = listAction;
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (UITableView *)tableView
{
    if (!_tableView) {
        _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
        _tableView.backgroundColor = [UIColor clearColor];
        //_tableView.dataSource = self;
       // _tableView.delegate = self;
       // _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        
        [self.tableView registerClass:[HomeBannerCell class] forCellReuseIdentifier:kHomeBannerCellID];
        [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"tableViewCell"];
       
    }
    return  _tableView;
}


@end

接下来是具体实施的HomeTableViewDataSource 类 

//
//  HomeTableViewDataSource.h
//  链式DSL学习
//
//  Created by HF on 17/3/8.
//  Copyright © 2017年 HF-Liqun. All rights reserved.
//

#import <Foundation/Foundation.h>

typedef void (^TableViewCellBannerAction)(id sender);
typedef void (^TableViewCellDailyAction)(id sender);
typedef void (^TableViewCellListAction)(id sender);

@interface HomeTableViewDataSource : NSObject <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, copy) TableViewCellBannerAction banneryAction; @property (nonatomic, copy) TableViewCellDailyAction dailyAction; @property (nonatomic, copy) TableViewCellListAction listAction; /** 传入数据源 @param anItems anItems @return anItems */ - (id)initWithItems:(NSArray *)anItems; @end // // HomeTableViewDataSource.m // 链式DSL学习 // // Created by HF on 17/3/8. // Copyright © 2017年 HF-Liqun. All rights reserved. // #import "HomeTableViewDataSource.h" #import "HomeBannerCell.h" typedef NS_ENUM(NSUInteger, HomeSectionType) { HomeSectionTypeBanner, //banner HomeSectionTypeDaily, //date HomeSectionTypeList //List }; @interface HomeTableViewDataSource () { NSMutableArray *sectionInfo; } @property (nonatomic, strong) NSArray *items; @end @implementation HomeTableViewDataSource - (id)init { return nil; } - (id)initWithItems:(NSArray *)anItems { self = [super init]; if (self) { sectionInfo = [NSMutableArray array]; [sectionInfo addObject:@(HomeSectionTypeBanner)]; [sectionInfo addObject:@(HomeSectionTypeDaily)]; if (anItems.count > 0) { [sectionInfo addObject:@(HomeSectionTypeList)]; //list 列表 } self.items = anItems; } return self; } - (id)itemAtIndexPath:(NSIndexPath *)indexPath { return self.items[(NSUInteger) indexPath.row]; } #pragma mark UITableViewDataSource - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return sectionInfo.count; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if (HomeSectionTypeBanner == [sectionInfo[section] integerValue]) { return 1; } if (HomeSectionTypeDaily == [sectionInfo[section] integerValue]) { return 1; } if (HomeSectionTypeList == [sectionInfo[section] integerValue]) { return self.items.count; } return 0; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger section = indexPath.section; if (HomeSectionTypeBanner == [sectionInfo[section] integerValue]) { HomeBannerCell *cell = [tableView dequeueReusableCellWithIdentifier:kHomeBannerCellID forIndexPath:indexPath]; return cell; } if (HomeSectionTypeDaily == [sectionInfo[section] integerValue]) { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"tableViewCell" forIndexPath:indexPath]; cell.textLabel.text = [NSString stringWithFormat:@"%@",[NSDate date]]; cell.textLabel.font = [UIFont boldSystemFontOfSize:15]; cell.textLabel.textAlignment = NSTextAlignmentCenter; return cell; } if (HomeSectionTypeList == [sectionInfo[section] integerValue]) { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"tableViewCell" forIndexPath:indexPath]; id item = [self itemAtIndexPath:indexPath]; cell.textLabel.text = [NSString stringWithFormat:@"%@",item]; return cell; } return [UITableViewCell new]; } #pragma mark UITableViewDelegate - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger section = indexPath.section; if (HomeSectionTypeBanner == [sectionInfo[section] integerValue]) { return [HomeBannerCell getCellHeight]; } if (HomeSectionTypeDaily == [sectionInfo[section] integerValue]) { return 55; } if (HomeSectionTypeList == [sectionInfo[section] integerValue]) { return 44; } return 0; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger section = indexPath.section; if (HomeSectionTypeBanner == [sectionInfo[section] integerValue]) { if (self.banneryAction) { self.banneryAction(@"点击了banner"); } } if (HomeSectionTypeDaily == [sectionInfo[section] integerValue]) { if (self.dailyAction) { self.dailyAction(@"点击了日期"); } } if (HomeSectionTypeList == [sectionInfo[section] integerValue]) { if (self.listAction) { id item = [self itemAtIndexPath:indexPath]; self.listAction([NSString stringWithFormat:@"点击了list单元 %@",item]); } } } @end 

参考:

1.https://objccn.io/issue-1-1/

以上是关于iOS 给 ViewController 减负 之 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

去“重”变“轻”,新年减负秘籍

iOS:数据在传递给另一个 ViewController 后消失

大数据说婚恋--再不给女性减负,结婚率和出生率都升不回来了

(iOS + Firebase)无法将图像从 UITableViewCell 传递给下一个 ViewController

iOS之深入探究动画渲染降帧

DBA 减负捷径:拍个 CT 诊断集群热点问题 | TiDB 4.0 新特性前瞻