UITableView奇怪的行为

时间:2011-06-04 17:45:35

标签: iphone xcode ios uitableview landscape

我正在使用UITableView编写一个首选项面板,如下所示: enter image description here

第一部分包含简单行,第二部分包含UISwitch作为子视图的行。

当我更改为横向并开始滚动时,tableview的行为方式很奇怪: enter image description here

这是我的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// Configure the cell
if (indexPath.section == 0) {
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    if (indexPath.row == 0) {
        cell.textLabel.text = @"Help";
    }else if (indexPath.row == 1){
        cell.textLabel.text = @"About us";
    }
    else if(indexPath.row == 2){
        cell.textLabel.text = @"Send to a friend";
    }
}else if(indexPath.section == 1){
    cell.accessoryType = UITableViewCellAccessoryNone;
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    if (indexPath.row == 0) {
        cell.textLabel.adjustsFontSizeToFitWidth = NO;
        cell.textLabel.text = @"Show favs at launch";
        [cell addSubview:favoritesSwitch];
    }else if (indexPath.row == 1){
        cell.textLabel.text = @"Open with Safari";
        [cell addSubview:browserSwitch];
    }
    else if(indexPath.row == 2){
        cell.textLabel.text = @"Remember query";
        [cell addSubview:lastQuerySwitch];
    }
    else if(indexPath.row == 3){
        cell.textLabel.text = @"Automatic keyboard";
        [cell addSubview:keyboardSwitch];
    }
}

return cell;
}

提前谢谢你:)

3 个答案:

答案 0 :(得分:4)

您应该执行以下操作:

继续对所有单元使用相同的CellIdentifier (性能!如果为每个单元创建一个新的标识符,它将起作用,但会占用大量内存)。使用多个Cell Identifier只适用于您的单元格根本不同的情况,例如不同的自定义UITableViewCell-Subclasses。

不要将您的交换机添加为子视图(!!!),而是使用cell.accessoryView = mySwitch。如果此单元格没有开关,请务必设置cell.accessoryView = nil以清理单元格以便重复使用。使用accessoryView for Switches将自动处理所有布局工作。

当您将accessoryView设置为nil时,您可以在重复使用单元格时继续为您的DetailDisclosure-Buttons使用accessoryType!

答案 1 :(得分:1)

可能会发生这种情况,因为您使用相同的单元格标识符来访问表格单元格。

尝试

NSString *CellIdentifier = [NSString stringWithFormat:@"Cell %d_%d",indexPath.section,indexPath.row];

而不是。

static NSString *CellIdentifier = @"Cell";

答案 2 :(得分:0)

tableView正在回收您添加了browserSwitch,lastQuerySwitch和keyboardSwitch的单元格。从单元格视图中删除这些内容毫无意义。在//配置单元格注释之后添加以下行。我认为这样可以解决它。

  [browserSwitch removeFromSuperview];
  [lastQuerySwitch removeFromSuperview];
  [keyboardSwitch removeFromSuperview];