简体   繁体   中英

UITableView reload

I am facing some problem in reloading the table. My cellForRowAtIndexPath is:

- (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;
}  

Structuring the cell this way helps me preserve the values of textFields when I scroll the table. But at some point when I reload the table control does not fall in the if condition because the cell has not been released yet. Where should I release the cell in this condition?

You need to separate creating/acquiring the cell instance from configuring the cell properties with data. Change your code as follows:

- (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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM