Murali
Murali

Reputation: 49

Check marks are unchecked when scroll the tableview

i am using tableview and display data. in the table view all checkMark items sent mail. but when scroll the table check marks are unchecked. i don't want un check when scroll the table. please help me. i am developing below code

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CustomCellIdentifier = @"CustomCellIdentifier ";
    CaptureCell *cell = (CaptureCell *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier];
    if (cell == nil) { 
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CaptureCell"
                                                     owner:self options:nil];
        for (id oneObject in nib) if ([oneObject isKindOfClass:[CaptureCell class]])
            cell = (CaptureCell *)oneObject;
    } 

    if ([[[dataArray objectAtIndex:indexPath.row] objectForKey:@"CaptureId"]isEqualToString:[dict objectForKey:[[dataArray objectAtIndex:indexPath.row] objectForKey:@"CaptureId"]]])
    {
        cell.confirmMail.image = [UIImage imageNamed:@"mailConfirm.png"];
    }
    NSString *input;
    input = [[dataArray objectAtIndex:indexPath.row]objectForKey:@"amount"];
    [input stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    //NSLog(@"after removing white spaces %@",input);
    double price;
    NSString *numberAsString = nil;
    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    NSLocale *gbLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
    [numberFormatter setLocale:gbLocale];
    [gbLocale release];
    [numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle];
    if ([[input stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]length]!=0)
    {
        NSLog(@"the input is***** %@",input);           
        price=[[input stringByReplacingOccurrencesOfString:@"$" withString:@""] doubleValue];
        NSLog(@"the price is %f",price);
        numberAsString = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:price]];
        NSLog(@"the numberAsString...... %@",numberAsString);
    }
    [numberFormatter release];


    cell.eventNameLbl.text = [[dataArray objectAtIndex:indexPath.row]objectForKey:@"expenseType"];
    cell.expenTypeLbl.text = [[dataArray  objectAtIndex:indexPath.row]objectForKey:@"empName"];
    cell.dataLbl.text = [[dataArray objectAtIndex:indexPath.row]objectForKey:@"Date"];
    cell.amountLbl.text = numberAsString;

    cell.billImage.image = [UIImage imageWithData:[[dataArray objectAtIndex:indexPath.row]objectForKey:@"image"]];

    //[cell.textLabel setText:[NSString stringWithFormat:@"Row %d", indexPath.row]];
    cell.selectionStyle=UITableViewCellSelectionStyleNone;
    NSIndexPath* selection = [tableView indexPathForSelectedRow];
    if (selection && selection.row == indexPath.row) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;  
    }



    // if([[[captureArray objectAtIndex:indexPath.row]objectForKey:@"eventName"]isEqualToString:[[selectedData objectAtIndex:indexPath.row]objectForKey:@"eventName"]])
    //  NSLog(@"Equal");

    //[cell setEditing:YES animated:YES];
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{


    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSString *selected = [dataArray objectAtIndex:indexPath.row];


    if([tableView isEditing] == YES)
    {
        AppDelegate *sharedDelegate = [[UIApplication sharedApplication]delegate];
        sharedDelegate.isEditCapture = YES;
        sharedDelegate.findDate = YES;
        NSString *imgDataStr = [[NSString alloc]initWithData:[[dataArray objectAtIndex:indexPath.row]objectForKey:@"image"] encoding:NSUTF8StringEncoding];
        NSLog(@"imageStr%@",imgDataStr);
        ExpensesCaptureViewController_iPhone *nextController = [[ExpensesCaptureViewController_iPhone alloc] initWithNibName:@"ExpensesCaptureViewController_iPhone" bundle:nil];

        nextController.captureId = [[dataArray objectAtIndex:indexPath.row] objectForKey:@"CaptureId"];
        [self.navigationController pushViewController:nextController animated:YES];
        [imgDataStr release];
        [nextController release];
        if([selectedData count]>0)
        {
            [selectedData removeObject:selected];
        }

    }


    else {
        if ([[[dataArray objectAtIndex:indexPath.row] objectForKey:@"CaptureId"]isEqualToString:[dict objectForKey:[[dataArray objectAtIndex:indexPath.row] objectForKey:@"CaptureId"]]])
        {
            NSLog(@"sent items");
        }

        else {
            if (cell.accessoryType == UITableViewCellAccessoryNone)
            {
                cell.accessoryType = UITableViewCellAccessoryCheckmark;

                [selectedData addObject:selected];

            }

            else 
            {

                cell.accessoryType = UITableViewCellAccessoryNone;            

                [selectedData removeObject:selected];   

            }

        }


    }

    NSLog(@"DataObjects %d %@",[selectedData count] ,[[dataArray objectAtIndex:indexPath.row] objectForKey:@"eventName"]);  

    //[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];

}

Upvotes: 0

Views: 1364

Answers (1)

Ahmed Hammad
Ahmed Hammad

Reputation: 445

The problem that you scroll your tableView when - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath method is called and you set

NSIndexPath* selection = [tableView indexPathForSelectedRow];
    if (selection && selection.row == indexPath.row) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;  
    }

that means when you will scroll indexPath will be for the current row only so the checkmark at the current row will still checked but the all the other rows will enter the else condition and the checkmark will be removed.

To fix it you should make a do the following:

define the following property:

@property (nonatomic)BOOL isViewIsLoadedForTheFirstTime;

-(void)viewDidLoad
{
    self.isViewIsLoadedForTheFirstTime = YES;
}

then replace these lines in the (cellForRow) method

if (selection && selection.row == indexPath.row) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;  
    }

to the following lines:

if (self.isViewIsLoadedForTheFirstTime) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark; 
        self.isViewIsLoadedForTheFirstTime = NO;
    } 

This will make you set the check mark only when the view loaded for the first time the when you will scroll it won't change.

I hope that will help you

Upvotes: 2

Related Questions