0

私はからデータをロードするカスタムセル(以下のコード)を持つUITableViewを持っていますNSDictionaryNSDictionaryNSArrayからそこにデータをロードしますobjectatIndexPath:indexpath.row

今、私は同じように機能する DidSelectRow 関数を持っています (NSArray -> NSDictionary -> セル データ)。

問題は、テーブルをスクロールすると、セルの定数が変更されることです。セルを常に同じ順序でリロードする必要があります。スクロール時にこのデータのリロードを停止する必要があります。

これは、テーブル ビューをロードし、データをテーブル ビュー セルにロードするために使用しているコードです。

        RequestArray = [jsonDictionary objectForKey:@"Content"];

        RequestTable =  [[UITableView alloc]initWithFrame:CGRectMake(0, 84, 320, 326)];
        RequestTable.backgroundColor = [UIColor colorWithRed:(234/255.f) green:(234/255.f) blue:(234/255.f) alpha:1];

        RequestTable.dataSource=self;
        RequestTable.delegate=self;

        RequestTable.rowHeight = 77;
        [self.view addSubview:RequestTable];

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

    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: SimpleTableIdentifier];

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

        NSDictionary *object = [RequestArray objectAtIndex:indexPath.row];

        NSString *Category = [object valueForKey:@"Category"];
        NSString *ItemDescription = [object valueForKey:@"ItemDescription"];
        NSString *ItemName = [object valueForKey:@"ItemName"];
        NSString *Date = [object valueForKey:@"Date"];
        NSString *ExpiresDate = [object valueForKey:@"ExpiresDate"];
        BOOL isRead = [[object valueForKey:@"IsRead"]boolValue];


        /// add time label to cell
        NSTimeInterval TIMEinterval = [Date intValue];
        NSDate* TIMEDate = [NSDate dateWithTimeIntervalSince1970:TIMEinterval];
        NSDateFormatter* df = [[NSDateFormatter alloc] init];
        [df setDateFormat:@"HH:mm"];
        [df setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:2]]; //+0000
        NSString* dateStrig = [df stringFromDate:TIMEDate];

        UILabel *RequestTime = [[UILabel alloc]initWithFrame:CGRectMake(268, 8, 33, 16)];
        [RequestTime setTextAlignment:UITextAlignmentRight];
        RequestTime.backgroundColor = [UIColor clearColor];
        RequestTime.textColor = [UIColor blackColor];
        [RequestTime setFont:[UIFont systemFontOfSize:12]];
        RequestTime.text = dateStrig;
        [cell addSubview:RequestTime];

        /// add experation label to cell

        NSTimeInterval EXPTIMEinterval = [ExpiresDate intValue];
        NSDate* EXPDate = [NSDate dateWithTimeIntervalSince1970:EXPTIMEinterval];

        NSTimeInterval secondsBetween = [EXPDate timeIntervalSinceDate:TIMEDate];
        int numberOfHours = secondsBetween / 3600;

        UILabel *ExperationTime = [[UILabel alloc]initWithFrame:CGRectMake(152, 24, 150, 15)];
        ExperationTime.backgroundColor = [UIColor clearColor];
        [ExperationTime setTextAlignment:UITextAlignmentRight];
        ExperationTime.textColor = [UIColor colorWithRed:(255/255.f) green:(103/255.f) blue:(18/255.f) alpha:1];
        [ExperationTime setFont:[UIFont systemFontOfSize:14]];
        if (numberOfHours>24){
            numberOfHours = numberOfHours/24;
            ExperationTime.text = [NSString stringWithFormat:@"המוצר דרוש תוך %d ימים",numberOfHours];

        }else{
            ExperationTime.text = [NSString stringWithFormat:@"המוצר דרוש תוך %d שעות",numberOfHours];

        }
        [cell addSubview:ExperationTime];

        // add item category to cell

        UILabel *itamCategory = [[UILabel alloc]initWithFrame:CGRectMake(143 , 5, 120, 21)];
        itamCategory.backgroundColor = [UIColor clearColor];
        [itamCategory setTextAlignment:UITextAlignmentRight];
        itamCategory.textColor = [UIColor colorWithRed:(0/255.f) green:(177/255.f) blue:(233/255.f) alpha:1];
        [itamCategory setFont:[UIFont boldSystemFontOfSize:17]];
        itamCategory.text = Category;
        [cell addSubview:itamCategory];

        // add item Name to cell

        UILabel *itamName = [[UILabel alloc]initWithFrame:CGRectMake(98, 39, 203, 21)];
        itamName.backgroundColor = [UIColor clearColor];
        [itamName setTextAlignment:UITextAlignmentRight];
        itamName.textColor = [UIColor blackColor];
        [itamName setFont:[UIFont boldSystemFontOfSize:17]];
        itamName.text = ItemName;
        [cell addSubview:itamName];

        // add item Description to cell

        UILabel *Description = [[UILabel alloc]initWithFrame:CGRectMake(98, 62, 203, 10)];
        Description.backgroundColor = [UIColor clearColor];
        [Description setTextAlignment:UITextAlignmentRight];
        Description.textColor = [UIColor blackColor];
        [Description setFont:[UIFont systemFontOfSize:13]];
        Description.text =ItemDescription;
        [cell addSubview:Description];

        //add sendOffer button
        UIButton *callSeller = [UIButton buttonWithType:UIButtonTypeCustom];
        callSeller.frame = CGRectMake(25, 8, 54, 45);
        [callSeller setTag:indexPath.row];

        [callSeller setBackgroundImage:[UIImage imageNamed:@"makeOfferTable.png"] forState:UIControlStateNormal];
        [callSeller setBackgroundImage:[UIImage imageNamed:@"makeOfferTable.png"] forState:UIControlStateHighlighted];

        [callSeller addTarget:self action:@selector(makeaOffer:) forControlEvents:UIControlEventAllEvents];
        [cell addSubview:callSeller];

        UIView *myBackView = [[UIView alloc] initWithFrame:cell.frame];
        myBackView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"highlightCellBG.png"]];
        cell.selectedBackgroundView = myBackView;
        cell.backgroundColor = [UIColor lightGrayColor];

        //add newOffer sign (if new)
        if (!isRead){
            UIImageView *newIndocator = [[UIImageView alloc]initWithFrame:CGRectMake(295, 0, 25, 25)];
            newIndocator.image = [UIImage imageNamed:@"newOfferIndicator.png"];
            [newIndocator setContentMode:UIViewContentModeScaleToFill];
            [cell addSubview:newIndocator];
        }

    }

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


    return cell;

}

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

        NSDictionary *object = [RequestArray objectAtIndex:indexPath.row];
        NSLog(@"indePath.row = %d",indexPath.row);

        Seller_RequestDetailsViewController *infoView = [[Seller_RequestDetailsViewController alloc]initWithNibName:@"Seller_RequestDetailsViewController" bundle:nil];

        NSString *OfferDate = [object valueForKey:@"Date"];

        NSTimeInterval TIMEinterval = [OfferDate intValue];
        NSDate* TIMEDate = [NSDate dateWithTimeIntervalSince1970:TIMEinterval];
        NSDateFormatter* df = [[NSDateFormatter alloc] init];
        [df setDateFormat:@"DD/MM/yyyy"];
        [df setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:2]]; //+0000

        infoView.date = [df stringFromDate:TIMEDate];


        infoView.itemName = [object valueForKey:@"ItemName"];
        infoView.modalName = [object valueForKey:@"ItemDegem"];
        infoView.buyerID = [NSString stringWithFormat:@"%@",[object valueForKey:@"BuyerUserID"]];
        infoView.city = [object valueForKey:@"Region"];
        infoView.Offerdescription = [object valueForKey:@"ItemDescription"];
        BOOL isRead = [[object valueForKey:@"IsRead"]boolValue];

        infoView.modalTransitionStyle = UIModalTransitionStylePartialCurl;
        [self presentModalViewController:infoView animated:YES];

        if (!isRead){
            [self markOfferAsRead:[NSString stringWithFormat:@"%@",[object valueForKey:@"ItemID"]]];
        }        

}
4

2 に答える 2

0

問題を完全に理解しているかどうかはわかりませんが、セルの作成方法に誤りがあります。セルをデキューした後、セルが nil の場合にのみセルを初期化し、セルをビルドしないでください。

static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: SimpleTableIdentifier];

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

// Now build the cell.

毎回セルを再構築しないと、最初に構築されたセルが再利用されます。

于 2012-05-09T18:41:34.857 に答える
0

あなたの問題は、すべてがこれにあるということです:

if(cell == nil) {
    //Your Code
}

起こっていることは、テーブルビューがセルを再利用することです。内容を変更しているだけですif(cell == nil)。必要なのは、新しいセルを横に作成するだけでif(cell == nil) 、残りのコードをその if ステートメントから移動することです

于 2012-05-09T23:51:48.290 に答える