0

私はテーブルビューと表示データを使用しています。テーブルビューでは、すべてのチェックマークアイテムがメールを送信しました。ただし、スクロールすると、テーブルのチェックマークがオフになります。テーブルをスクロールするときにチェックを外したくありません。私を助けてください。私は以下のコードを開発しています

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

}
4

1 に答える 1

2

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathメソッドが呼び出されて設定されたときにtableViewをスクロールする問題

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

つまり、スクロールするときに indexPath は現在の行のみを対象とするため、現在の行のチェックマークは引き続きチェックされますが、他のすべての行は else 条件に入り、チェックマークが削除されます。

それを修正するには、次のことを行う必要があります。

次のプロパティを定義します。

@property (nonatomic)BOOL isViewIsLoadedForTheFirstTime;

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

次に、(cellForRow) メソッドでこれらの行を置き換えます

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

次の行に:

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

これにより、ビューが初めてロードされたときにのみチェックマークを設定し、スクロールしても変更されません。

それがあなたを助けることを願っています

于 2012-11-15T13:28:53.477 に答える