views:

937

answers:

2

on my tableview i have the last cell that is not initially visible as seen in the first image, when i scroll the list up, you can see in the second image that the price or my detailTextLabel is put on a new line not maintaining the right justification.
image 1

image 2


Here is the code, i can't figure out why its doing this, any direction or help would be much appreciated

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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [ltableView dequeueReusableCellWithIdentifier:CellIdentifier];    
    // Configure the cell.
    NSUInteger indexRow = [indexPath row];
    switch (indexRow) {
        case 0:{
            NSCharacterSet *set = [NSCharacterSet whitespaceCharacterSet];
            NSString *description = [[currentData objectForKey:@"Description"] stringByTrimmingCharactersInSet:set];

            if (cell == nil) {
                    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
            }
            cell.selectionStyle =  UITableViewCellSelectionStyleNone;
            cell.accessoryType = UITableViewCellAccessoryNone;
            cellShift = 1;


            if (![description isEqualToString:@""]) {
                cell.textLabel.text = @"";
                cell.detailTextLabel.text = description;
                cell.detailTextLabel.numberOfLines = 2;
            }
            else {
                cell.textLabel.text = @"";
                cell.detailTextLabel.text = @"";
                cell.detailTextLabel.numberOfLines = 0;


            }
            break;
        }
        default:{
            if (cell == nil) {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
            }
            NSDictionary *item = [tableData objectAtIndex:(indexRow-cellShift)];
            NSString *name = [item objectForKey:@"Name"];
            if ([name length] > MaxVendorsLength ) {
                name =  [NSString stringWithFormat:@"%@ ...",[name substringToIndex:MaxVendorsLength]];
            }
            cell.textLabel.text = name;
            cell.textLabel.minimumFontSize = 12;

            NSString *priceString;
            float price = [[item objectForKey:@"Price"] floatValue];
            //NSLog(@"| %@ | : | %@ |",[item objectForKey:@"Name"], [item objectForKey:@"Price"]);
            if (price != 0) {
                priceString = [[NSString alloc] initWithFormat:@"$%.2f",price];
            }
            else {
                priceString = [[NSString alloc] initWithString:@"--"];
            }

            cell.detailTextLabel.text =  priceString;

            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            [priceString release];          
            break;
        }
    }
    cell.textLabel.font = [UIFont boldSystemFontOfSize:15];
    cell.textLabel.minimumFontSize = 14;
    cell.detailTextLabel.font = [UIFont boldSystemFontOfSize:15];
    cell.detailTextLabel.minimumFontSize = 14;
    return cell;
}

Let me know if i need to post anything else to get help with this ???

+1  A: 

You're using the same cell identifier for all rows but the 0th row has a different style. When scrolling up, a subtitle-styled cell might be getting re-used.

Try using a different cell identifier for the 0th row. Keep just the declaration of cell outside the switch and move the dequeueReusableCellWithIdentifier to each case.

DyingCactus
+2  A: 

It's because when you scroll up the top cell is reused because all of your cells have the same cell identifier (the first line you have). You need to declare the two cell identifiers and use the appropriate one based on what row you're trying to get.

static NSString *FirstRowCellIdentifier = @"A";
static NSString *OtherRowCellIdentifier = @"B";

NSString *cellIdentifier = nil;
if ([indexPath row] == 0)
    cellIdentifier = FirstRowCellIdentifier;
else
    cellIdentifer = OtherRowCellIdentifier;

UITableViewCell *cell = [ltableView dequeueReusableCellWithIdentifier:cellIdentifier];
// .....

Then you can use the rest of your code as is. This just ensures that the resused cell is of the correct type.

thelaws
awesome, worked great, thanks so much
slim