iOS中的UITableView的重用机制与加载优化详解

2020-01-18 20:09:36刘景俊
// 假设有三个视图控制器,一个作为父控制器,两个作为子控制器 UIViewController *superVC = [[UIViewController alloc]init]; UITableViewController *subVC1 = [[UITableViewController alloc]init]; UITableViewController *subVC2 = [[UITableViewController alloc]init]; // 将子视图控制器添加到父视图控制器(要注意调整子视图的尺寸和位置合理显示,这里忽略) [superVC.view addSubview:subVC1.view]; [superVC addChildViewController:subVC1]; [superVC.view addSubview:subVC2.view]; [superVC addChildViewController:subVC2]; // 子视图控制器的移除有对称的方法,但只能是子视图控制器主动从父视图控制器中移除 [subVC1.view removeFromSuperview]; [subVC1 removeFromParentViewController]; [subVC2.view removeFromSuperview]; [subVC2 removeFromParentViewController];

此外要注意和presentViewController函数添加子视图控制器的区别,上面手动添加子视图控制器是可以自由调整子视图的frame的(包括子视图位置和尺寸),而presentViewController是用于页面切换,切换后的子页面会覆盖整个屏幕而不可以自由调整子页面位置和尺寸,对称的子视图控制器移除方法为dismissViewControllerAnimated:


  // 显示子视图控制器,completion后的代码块如果不为空添加结束后会触发
  [[parentVC presentViewController:childVC animated:NO completion:nil];
  // 移除子视图控制器,completion后的代码块如果不为空添加结束后会触发
  [childVC dismissViewControllerAnimated:NO completion:nil];

一个tableView是否可以关联两个不同的datasource数据源?如何处理?

多个数据源是完全可以的,关键是如何关联,问题的重点是如何处理,因为将数据源(Model)和tableview视图(View)的对接工作是程序员完成的,因此数据源的多少没有根本影响。处理上可以分开依次对接,也可以通过数据的集合操作先将数据整理合并成一个数据源然后对接。

例如:一个表格中的每个cell显示的是一个人的基本信息,为了简单这里假设只有一个头像和一个姓名。假设有两个数据源,一个数据源是头像的url数组,一个是姓名的字符串数组,对接时完全可以分开在cell数据回调中对接,也可以将两个数组合并然后对接。

合并数据用到的数据模型:


@interface Model : NSObject

@property (nonatomic,copy) NSString *name; // 姓名
@property (nonatomic,copy) NSString *url;  // 图片

@end

数据源缓冲器:


// 数据源
@property (nonatomic, strong)NSArray *name_datasource;
@property (nonatomic, strong)NSArray *url_datasource;
@property (nonatomic, strong)NSMutableArray *datasource;

处理多数据源:


/**
 * 请求数据
 */
- (void)request {
  // 姓名数据源
  _name_datasource = @[@"张三", @"李四", @"小明", @"小李"];
  _url_datasource = @[@"male", @"male", @"male", @"male"];

  // 合并数据源
  for (int i; i<_name_datasource.count; i++) {
    Model *model = [[Model alloc]init];
    model.name = _name_datasource[i];
    model.url = _url_datasource[i];
    [_datasource addObject:model];
  }
}