将 UISwitch 添加到 TableView 中的一个单元格

Posted

技术标签:

【中文标题】将 UISwitch 添加到 TableView 中的一个单元格【英文标题】:Add UISwitch to only one cell in TableView 【发布时间】:2013-03-11 19:42:03 【问题描述】:

我试图将 UISwitch 添加到我的表格视图中的一个单元格中,代码如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    FormCell *cell = (FormCell *) [tableView dequeueReusableCellWithIdentifier: @"FormCell"];
    if(cell == nil) cell = [[FormCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"FormCell"];

    if(indexPath.row == 3)
    
        UISwitch *mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(100, 9, 50, 50)];
        [mySwitch addTarget: self action: @selector(flip:) forControlEvents:UIControlEventValueChanged];
        [cell.contentView addSubview:mySwitch];

        [[UISwitch appearance] setOnTintColor:[UIColor colorWithRed:163.0/255.0 green:12.0/255.0 blue:17.0/255.0 alpha:1.0]];
    

    return cell;

它的工作原理,问题是当我向上或向下滚动表格视图时,它会复制 UISwitch,但最终还是在表格视图的开头...

有什么帮助吗?

【问题讨论】:

我们可以得到更多tableView:heightForRowAtIndexPath吗? @Larme 编辑以便更好地理解。 【参考方案1】:

记住单元格可以重复使用。你最好用自己的标识符创建一个自定义 UITableViewCell 。在那里做你的定制。

【讨论】:

比起尝试“清理”通用可重用单元格,我更喜欢这个。将第二个 UITableViewCell 添加到表中,给它自己的标识符,当调用 get-cell-for-row 时,如果 row == 3,则返回此单元格。这样,该单元格仅用于第 3 行。需要如果要在代码而不是情节提要中添加开关,请注意不要多次添加开关对象。【参考方案2】:

UITableView 进行了高度优化,其中一项主要优化是尽可能重用表格单元格对象。这意味着表格行和 UITableViewCell 对象之间没有永久的一对一映射。

因此,单元格对象的同一个实例可以重复用于多行。一旦单元格的行滚动到屏幕外,该行的单元格就会进入“回收”堆,并且可能会被重新用于屏幕上的另一个行。

通过创建 Switch 对象并将它们添加到单元格中,每次第三行出现在屏幕上时,您都会再次将其添加到任何 Cell 对象中,表格恰好为第 3 行“出列”。

如果您要向可重复使用的单元格添加内容,则必须具有相应的代码,以便在将单元格重新用于另一个表格行时将其重置为默认值。

【讨论】:

【参考方案3】:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  FormCell *cell = (FormCell *) [tableView dequeueReusableCellWithIdentifier: @"FormCell"];

  if(cell == nil)    
      cell = [[FormCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"FormCell"];
  
 else
  
    for (UIView *subview in [cell subviews]) 
    
        [subview removeFromSuperview];
    
  

if(indexPath.row == 3)

    UISwitch *mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(100, 9, 50, 50)];
    [mySwitch addTarget: self action: @selector(flip:) forControlEvents:UIControlEventValueChanged];
    [cell.contentView addSubview:mySwitch];

    [[UISwitch appearance] setOnTintColor:[UIColor colorWithRed:163.0/255.0 green:12.0/255.0 blue:17.0/255.0 alpha:1.0]];


return cell;

这不会复制表格滚动上的 UISwitch 另一种方法是将reuseIdentifier 设置为nil。 希望这会有所帮助。

【讨论】:

以上是关于将 UISwitch 添加到 TableView 中的一个单元格的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式切换uiswitch按钮

如何以编程方式将约束添加到tableView单元格的默认textLabel和accessoryView

在 TableViewCell 中保持 UISwitch 的状态:Swift

addTarget:action:forControlEvents - TableView 中的 UISwitch - 发送方正常,事件始终为 0x0

以编程方式访问 UISwitch 大小而不添加组件

在 Tableview 上添加开关按钮并禁用单元格选择