关于tableView:cellForRowAtIndexPat

2018-07-02  本文已影响0人  二丁目90

先来一段小伙伴们写tableView时经常会出现的经典的if else:

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath

{

    if(indexPath.row==0)

    {

        TableViewTypeFirstCell *cell= [tableView dequeueReusableCellWithIdentifier:@"first"];

        returncell;

    }

    elseif(indexPath.row==1)

    {

        TableViewTypeSecondCell *cell= [tableView dequeueReusableCellWithIdentifier:@"second"];

        returncell;

    }

    elseif(indexPath.row==2)

    {

        TableViewTypeThirdCell *cell= [tableView dequeueReusableCellWithIdentifier:@"third"];

        returncell;

    }

    else

    {

        TableViewTypeFourthCell *cell = [tableView dequeueReusableCellWithIdentifier:@"fourth"];

        returncell;

    }

}

在iOS开发当中UITableView是一个十分常用的view,在我们写一些比较复杂的界面的时候,常常会发现自己在tablevie的datasource中经常出现大段大段的if else或switch case语句,这样通常会造成一个比较臃肿和难以维护的代码,那么我们怎么能够优化他们呢?

首先我们新建一个类并初始化:

@interface MyTableViewDataSource : NSObject<UITableViewDataSource>

@end

MyTableViewDataSource *tableViewDataSource = [[MyTableViewDataSource alloc] init];

并且在我们的controller里设置self.tableView.dataSource = tableViewDataSource;

在我们的dataSource的实现类是这样的:

@inteface MyTableViewDataSource()

@property (nonatomic, storng) MyFirstTableViewDataSource firstDataSource;

@property (nonatomic, storng) MySecondTableViewDataSource secondDataSource;

@property (nonatomic, storng) MyThirdTableViewDataSource thirdDataSource;

@property (nonatomic, storng) MyFourthTableViewDataSource fourthDataSource;

@end

我们在MyTableViewDataSource里的

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath

{

    id<UITableViewDataSource> dataSource = [self findDataSourceOfIndexPath:indexPath];

    return [dataSource tableView:tableView cellForRowAtIndexPath:indexPath];

}

在我们的MyFirstTableViewDataSource的实现文件里

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath

{

    TableViewTypeFirstCell *cell= [tableView dequeueReusableCellWithIdentifier:@"first"];

        return cell;

}

大家看到这里可能比较疑惑,我把这些全部写在viewController里不好么,像上面这样的情况我们足足新建了五个类遵循UITableViewDataSource,这不会造成我们的项目中的类数量的激增么,而且这样下来我们多写了很多行代码,似乎这样做是一样吃力不讨好的活。

其实笔者想说的是在大部分的应用场景下的确没必要这样写,但是如果你的项目代码中存在很多的类似这样的if else的判断,并且你想优化你的代码,你可以试试按照这样的方式进行重构,你会发现你的代码的测试性和健壮性都更好了,而且当你想扩展活着修改你应用程序的功能的时候,发现只需增加和修改相应的类就可以了。

上一篇 下一篇

猜你喜欢

热点阅读