1

我试图将 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,但最终或在表格视图的开头......

有什么帮助吗?

4

3 回答 3

0

记住细胞被重复使用。你最好用自己的标识符创建一个自定义的 UITableViewCell 。在那里做你的定制。

于 2013-03-11T19:51:09.700 回答
0

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

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

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

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

于 2013-03-11T19:51:14.780 回答
0
- (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 另一种方法是将 设置reuseIdentifiernil。希望这可以帮助。

于 2013-03-12T06:50:32.057 回答