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

2020-01-18 20:09:36刘景俊


/**
 * 分区个数设置为1
 */
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
  return 1;
}

/**
 * 创建20个cell,保证覆盖并超出整个tableView
 */
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  return 20;
}

/**
 * cell复用机制测试
 */
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  // 定义cell重用的静态标志符
  static NSString *cell_id = @"cell_id_demo";
  // 计数用
  static int countNumber = 1;
  // 优先使用可复用的cell
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cell_id];
  // 如果要复用的cell还没有创建,则创建一个供之后复用
  if (cell == nil) {
    // 新创建cell并使用cell_id复用符标记
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cell_id];
    // 计数器标记新创建的cell
    cell.textLabel.text = [NSString stringWithFormat:@"Cell%i", countNumber];
    // 计数器递增
    countNumber++;
  }
  return cell;
}

运行在iPhone5S设备上(UITableViewController作为跟控制器,tableView覆盖整个屏幕),20个cell显示结果依次为:

Cell1、Cell2、Cell3、Cell4、Cell5、Cell6、Cell7、Cell8、Cell9、Cell10、Cell11、Cell12、Cell13、Cell14、Cell1、Cell2、Cell3、Cell4、Cell5、Cell6

uitableview重用机制,ios重用机制,ios,cell的重用机制

uitableview重用机制,ios重用机制,ios,cell的重用机制

可以看出一共创建了14个cell,其中整个屏幕可显示13个cell,系统多创建一个的原因是保证在表格滑动显示半个cell时仍然能覆盖整个tableView。之后的6个cell就是复用了开始创建的那6个cell了。这样UITableViewCell复用的基本机制就很清楚了,另外还会有reloadData或者reloadRowsAtIndex等刷新表格数据的情况,可能会伴随新的cell创建和可复用cell的更新,但也是建立在基本复用机制的基础之上的。

能否在一个视图控制器中嵌入两个tableview控制器?

可以,相当于视图以及视图控制器的嵌套,视图可以添加子视图,视图控制器也可以添加子控制器。这么问应该是因为这种情况有时会用到而且很重要,因为有一点容易被忽视,就是将子视图添加到了父视图却忘记将对应的控制器作为子控制器添加到父控制器,导致子视图能显示但是不能响应(没有对接好控制器)。例如在当前视图上放一个小尺寸的表格组件,也就是在UIViewController上添加一个UITableViewController子控制器及其子view: