来自 header 个选择的 UITableview 的多个部分

Multiple section from header selection UITableview

我正在尝试像使用 tableview 的 treeview 那样处理 select 多个项目 你知道做树视图的其他方法吗?

我正在尝试向不同提供商的相机用户授予权限

我如何 select 来自 header 部分

上的 UIButton 的所有子项
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{

  CGRect frame = tableView.frame;

  UIButton *selectButton = [[UIButton alloc] initWithFrame:CGRectMake(0, -5, 40, 40)];
  [selectButton setImage:[UIImage imageNamed:@"ic_combobox_off"] forState:UIControlStateNormal];
  
  [selectButton addTarget:self action:@selector(headerSelected:) forControlEvents:UIControlEventTouchUpInside];

  UILabel *title = [[UILabel alloc] initWithFrame:CGRectMake(40, 0, 200, 30)];
  title.text = [_dataProviders objectAtIndex:section];

  UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
  [headerView addSubview:selectButton];
  [headerView addSubview:title];
  [headerView setBackgroundColor:UIColor.lightGrayColor];
  return headerView;
  }

- (void) headerSelected:(NSInteger) section { }

- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
  
  VideoPermissionsServiceTableViewCell *cell = (VideoPermissionsServiceTableViewCell*) [tableView dequeueReusableCellWithIdentifier:CELL_VIDEO_PERMITION forIndexPath:indexPath];
  
  NSString *sectionTitle = [_dataProviders objectAtIndex:indexPath.section];
  NSArray *sectionDevice = [_dataInput objectForKey:sectionTitle];
  NSString *device = [sectionDevice objectAtIndex:indexPath.row];
  
  cell.deviceLabel.text = device;
  
  [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
  return cell;
  }
- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  NSString *providers = [_dataProviders objectAtIndex:section];
  NSArray *devices= [_dataInput objectForKey:providers];
  return [devices count];
}

首先,您的代码中存在很多问题:

  1. 将 UITableViewHeaderFooterView 用于 header 和页脚视图。这样可以节省内存。有很多例子和教程;
  2. 在 cellForRowAtIndexPath() 中,你的 cell 在 dequeueReusableCellWithIdentifier() 之后可以是 nil,除非你在视图控制器加载时间的某个地方注册了 cell nib;
  3. headerSelected() 采用事件发送者的输入参数,而不是节号。在您的情况下,它将是您的 UIButton。在此方法中,您应该从按钮本身找到部分编号。好主意是在 header 视图填充期间将部分设置为按钮。尝试使用标签 属性;
  4. 在最简单的情况下,有节号,您可以遍历该节中的单元格,通过 cellForRowAtIndexPath() 获取单元格,访问其按钮,并将其设置为新状态。

请注意,您只能获取可见单元格。为了使其适用于那些向下滚动的人,您需要他们在 cellForRowAtIndexPath() 中填充单元格期间根据部分按钮状态设置按钮状态。