关于tableView:cellForRowAtIndexPat
先来一段小伙伴们写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的判断,并且你想优化你的代码,你可以试试按照这样的方式进行重构,你会发现你的代码的测试性和健壮性都更好了,而且当你想扩展活着修改你应用程序的功能的时候,发现只需增加和修改相应的类就可以了。