说实话这个我刚刚看到的时候还是没有这么明白过来,然后回去想了很久终于理解了。
1.先做好一个继承自UITabelViewCell的基类,我们要明白基类是干嘛的,这个类也就是将数据显示到UITableView上的
在加载事件里面设置预估行高和自动行高,并且注册nib(我自定义了两个UITableVIewCell所以要注册两次)
//设置预估行高
self.tableView.estimatedRowHeight = 80;
//设置cell高度
self.tableView.rowHeight = UITableViewAutomaticDimension;
//注册nib
[self.tableView registerNib:[UINib nibWithNibName:@"NewsImageTableViewCell" bundle:nil] forCellReuseIdentifier:@"data"];
[self.tableView registerNib:[UINib nibWithNibName:@"MyNewsTableViewCell" bundle:nil] forCellReuseIdentifier:@"myData"];
2.然后就是将数据显示到UITableView上(我这里是在一个UITableView上显示的两种UITableViewCell)。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NewsModel *model = self.array[indexPath.row];
if(model.imgextra.count==2)
{
NewsImageTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"data"];
cell.model = model;
return cell;
}
else
{
MyNewsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myData"];
cell.model = model;
return cell;
}
}
//要注意的是,设置UITableView的组为1,和设置UITableView显示的数据条数,
3.好了填数据都ok了,我们需要拿到从子类传过来的数据所以定义一个这样一个属性
3.重要的是在基类创建一个可在任何地方调用的可变数组,他们两个相当于是统一个数组。
@property(nonatomic,strong,readonly)NSMutableArray *array;//在.h文件
@property(nonatomic,strong)NSMutableArray *array;//在.m文件
4.现在来定义数据模型,模型的基本属性我就不写了,看看重要的block,和数据回传的方法
//数据要从哪里来,就从我们的模型层里面来这里给他创建了一个block来传递我们的数据
typedef void (^callBackBlock)(NSArray *newArray,NSError *error);
//定义一个block为参数的方法数据回传
+ (void) updateWebDataWithURL:(NSURL *)url filshed:(callBackBlock)filshed;
//实现返回数据的方法实现
+ (void) updateWebDataWithURL:(NSURL *)url filshed:(callBackBlock)filshed
{
//创建模型数组
NSMutableArray *arrayModel = [NSMutableArray array];
//创建会话
NSURLSession *session = [NSURLSession sharedSession];
//发起任务
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//处理数据,接收返回来的数据
NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
//从字典中拿到需要的数组数据
NSArray *arrayTemp = result[result.keyEnumerator.nextObject];
for(NSDictionary *dic in arrayTemp)
{
NewsModel *model = [[NewsModel alloc]initWithdic: dic];
[arrayModel addObject:model];
}
//跟新ui
dispatch_async(dispatch_get_main_queue(), ^{
//将数组和错误通过block回传给调用者
filshed(arrayModel,error);
});
}];
//执行任务
[dataTask resume];
}
5.最后来创建一个继承自基类的控制器,然后你会发现这样会帮你省了很多代码量。
NSURL *url = [NSURL URLWithString:@"http://c.m.163.com/nc/article/list/T1348649654285/0-20.html"];
[NewsModel updateWebDataWithURL:url filshed:^(NSArray *newArray, NSError *error) {
//这里是将newArray数据处理之后,然后回传回来,把值赋给父类array来达到显示数据
[self.array addObjectsFromArray:newArray];
[self.tableView reloadData];
}];
总结:主要是通过block来处理数据,然后处理完之后把数据赋值给父类。然后通过父类来刷新UITableView界面的数据。