UITableView重新加载

时间:2011-12-16 05:28:13

标签: iphone ipad uitableview

我在重新加载表时遇到了一些问题。我的cellForRowAtIndexPath是:

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

    int counter=indexPath.row;

    NSString *CellIdentifier = [NSString stringWithFormat:@"%d",counter];

    // Dequeue or create a cell of the appropriate type.
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        cell.selectionStyle=UITableViewCellSelectionStyleNone;


    //ID
    UILabel *lblID=[[UILabel alloc]init];
    lblID.frame=CGRectMake(10, 15.0, 150, 30.0);
    [lblID setFont:[UIFont boldSystemFontOfSize:20.0]];
    [lblID setBackgroundColor:[UIColor clearColor]];
    [lblID setTextColor:[UIColor blackColor]];
    lblID.text = [arrID objectAtIndex:indexPath.row];
    [cell.contentView addSubview:lblID];
    [lblID release];

    //Date
    UILabel *lblName=[[UILabel alloc]init];
    lblName.frame=CGRectMake(130, 15.0, 250, 30.0);
    [lblName setFont:[UIFont systemFontOfSize:20.0]];
    [lblName setBackgroundColor:[UIColor clearColor]];
    [lblName setTextColor:[UIColor blackColor]];
    lblName.text = [arrProductName objectAtIndex:indexPath.row];
    [cell.contentView addSubview:lblName];
    [lblName release];

    //Qty
    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(320, 20, 50, 30)];
    [textField addTarget:self action:@selector(TextOfTextField:)
        forControlEvents:UIControlEventEditingDidEnd];
    textField.userInteractionEnabled = true;
    textField.borderStyle = UITextBorderStyleRoundedRect;
    textField.font = [UIFont systemFontOfSize:15];
    textField.text = [arrItems objectAtIndex:indexPath.row];
    textField.tag = indexPath.row;
    textField.autocorrectionType = UITextAutocorrectionTypeNo;
    textField.keyboardType = UIKeyboardTypePhonePad;
    textField.returnKeyType = UIReturnKeyDone;
    textField.clearButtonMode = UITextFieldViewModeWhileEditing;
    textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;    
    textField.delegate = self;
    [arrTxtItems addObject:textField];
    [cell.contentView addSubview:textField];
    [textField release];

    //Discount
    UITextField *txtDiscount = [[UITextField alloc] initWithFrame:CGRectMake(460, 20, 50, 30)];
  //  [txtDiscount addTarget:self action:@selector(TextOfTextField:)
    //    forControlEvents:UIControlEventEditingDidEnd];
    txtDiscount.userInteractionEnabled = true;
    txtDiscount.borderStyle = UITextBorderStyleRoundedRect;
    txtDiscount.font = [UIFont systemFontOfSize:15];
    txtDiscount.text = [arrDiscount objectAtIndex:indexPath.row];
    txtDiscount.tag = indexPath.row;
    txtDiscount.autocorrectionType = UITextAutocorrectionTypeNo;
    txtDiscount.keyboardType = UIKeyboardTypePhonePad;
    txtDiscount.returnKeyType = UIReturnKeyDone;
    txtDiscount.clearButtonMode = UITextFieldViewModeWhileEditing;
    txtDiscount.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;    
    txtDiscount.delegate = self;
    [arrTxtDiscount addObject:txtDiscount];
    [cell.contentView addSubview:txtDiscount];
    [txtDiscount release];

    //Price
    UILabel *lblPrice=[[UILabel alloc]init];
    lblPrice.frame=CGRectMake(560, 15.0, 250, 30.0);
    [lblPrice setFont:[UIFont boldSystemFontOfSize:20.0]];
    [lblPrice setBackgroundColor:[UIColor clearColor]];
    [lblPrice setTextColor:[UIColor blackColor]];
    [arrLblNetPrice addObject:lblPrice];
    NSString *strPrice = [arrPrice objectAtIndex:indexPath.row];

    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
    [formatter setGroupingSeparator:@"."];
    [formatter setGroupingSize:2];
    [formatter setUsesGroupingSeparator:YES];
    [formatter setSecondaryGroupingSize:3];
    NSString *str = [formatter stringFromNumber:[NSNumber numberWithDouble:[strPrice doubleValue]]];
    [formatter release];
    NSLog(@"str :   %@",str);
    NSLog(@"strPrice :    %@",strPrice);
    lblPrice.text = str;
    [cell.contentView addSubview:lblPrice];
    [lblPrice release];
    }
        return cell;
}  

以这种方式构造单元格有助于在滚动表格时保留textFields的值。但在某些时候,当我重新加载表控件时,不会落入 if condition ,因为该单元尚未被释放。在这种情况下我应该在哪里释放细胞?

1 个答案:

答案 0 :(得分:1)

您需要将创建/获取单元实例与使用数据配置单元属性分开。按如下方式更改您的代码:

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

    int counter=indexPath.row;

    NSString *CellIdentifier = [NSString stringWithFormat:@"%d",counter];

    // Dequeue or create a cell of the appropriate type.
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        cell.selectionStyle=UITableViewCellSelectionStyleNone;

        //ID
        UILabel *lblID=[[UILabel alloc]init];
        lblID.frame=CGRectMake(10, 15.0, 150, 30.0);
        [lblID setFont:[UIFont boldSystemFontOfSize:20.0]];
        [lblID setBackgroundColor:[UIColor clearColor]];
        [lblID setTextColor:[UIColor blackColor]];
        lblID.tag = MyViewTagIDLabel;      // make an enum to give your subviews unique tags > 0
        [cell.contentView addSubview:lblID];
        [lblID release];

        // add the rest of your subviews

        // any other cell configuration that does not change based on the ind
    }

    // configure the cell with data based on the indexPath
    UILabel lblID = [cell.contentView viewWithTag:MyViewTagIDLabel];
    lblID.text = [arrID objectAtIndex:indexPath.row];

    // configure the rest of the subviews

    return cell;
}