0

テーブルビューにロードしている UITableViewCell nib を作成しましたが、テーブルをスクロールすると奇妙なことが起こります。同じことが上部で起こっています。

以下のコードは、myObj から入手可能なデータに応じてロードする nib を決定しています。これが理解できることを願っています。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (indexPath.section == 0) {
        // Set cell height
        [self tableView:tableView heightForRowAtIndexPath:indexPath];

        //call obj array with all of the values from my sorting algorithum
        SearchResultItem *myObj = (searchResultItem*)[dataArrayOfObjects objectAtIndex:indexPath.row];



        // This gets the year string ready  ----->

        // Create Year string
        NSString *yearRangeString = [[NSString alloc] init];

        // do some special stuff here with the years
        if ((myObj.yearStart < 1) && (myObj.yearFinish < 1)){
            //            yearRangeLabel.text = @"";
            yearRangeString = @"";
        }
        if ((myObj.yearStart < 1) && (myObj.yearFinish > 1)){
            //            yearRangeLabel.text = [NSString stringWithFormat:@"upto %i", myObj.yearFinish];
            yearRangeString = [NSString stringWithFormat:@"upto %i", myObj.yearFinish];
        }
        if ((myObj.yearStart > 1) && (myObj.yearFinish < 1)){
            //            yearRangeLabel.text = [NSString stringWithFormat:@"from %i", myObj.yearStart];
            yearRangeString = [NSString stringWithFormat:@"from %i", myObj.yearStart];
        }
        if ((myObj.yearStart > 1) && (myObj.yearFinish > 1)){
            //            yearRangeLabel.text = [NSString stringWithFormat:@"%i to %i",myObj.yearStart, myObj.yearFinish];
            yearRangeString = [NSString stringWithFormat:@"%i to %i",myObj.yearStart, myObj.yearFinish];
        }

        // adjust year string is (submodel) is avalible or not
        if (([yearSelectedString isEqualToString:@"all"]) && ([sModelSelectedString isEqualToString:@"all"])) {
            yearRangeString = [NSString stringWithFormat:@"(%@) %@", myObj.subModel, yearRangeString];
            yearRangeLabel.text = yearRangeString;
        }
        else if ((![yearSelectedString isEqualToString:@"all"]) && ([sModelSelectedString isEqualToString:@"aSearchResultItemll"])) {
            yearRangeString = [NSString stringWithFormat:@"(%@)", myObj.subModel];
            yearRangeLabel.text = yearRangeString;
        }
        else if (([yearSelectedString isEqualToString:@"all"]) && (![sModelSelectedString isEqualToString:@"all"])) {
            yearRangeString = [NSString stringWithFormat:@"%@", yearRangeString];
            yearRangeLabel.text = yearRangeString;
        }
        else if ((![yearSelectedString isEqualToString:@"all"]) && (![sModelSelectedString isEqualToString:@"all"])) {
            yearRangeLabel.text = nil;
        }

    // check year string if too large use B nibs ----->

        // Get yearRangeString width to see if you need to use a yearRangeLabel with second line
        CGSize yearStringSize = [yearRangeString sizeWithFont:[UIFont fontWithName:@"Helvetica" size:15] constrainedToSize:CGSizeMake(226, 21) lineBreakMode:NSLineBreakByWordWrapping ];

        // NSLog(@"width = %f, height = %f", yearStringSize.width, yearStringSize.height);



     // Get rest of nibs ready ----->

        // Set custom cell to display
        // check to see if there is a description, if there is choose the correct tableviewcell

        if (([myObj.note isEqualToString:@""]) && (([sModelSelectedString isEqualToString:@"all"]) || ([yearSelectedString isEqualToString:@"all"])) && (yearStringSize.width <= 100.00)) {

            // Configure the cell using custom cell
            [[NSBundle mainBundle] loadNibNamed:@"auSearchCell" owner:self options:nil];

            // Set up the different labels in each cell
            descriptionLabel.text = myObj.sDescription;
            iDLabel.text = [NSString stringWithFormat:@"%i", myObj.mID];
            cLabel.text = myObj.cDesc;
            INLabel.text = [NSString stringWithFormat:@"%i", myObj.ssID];

            cell = automativeSearchCell;
        }

        /// other if statments for different types of cells

         //Disclosure Indicator
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    return cell;
}

どんな助けでも大歓迎です

4

2 に答える 2

1

いくつか問題があるようです。heightForRowAtIndexPath: を呼び出すべきではありません。テーブル ビューによって呼び出されます。インデックス パスに基づいて、必要な高さを設定する必要があります。また、毎回通常の UITableViewCell をデキューし、文字列が長すぎる場合は他のセルに切り替えるように見えます。最初に文字列サイズのチェックを行ってから、適切なセルをデキューする必要があります。また、弦が長すぎるたびにペン先をロードしているようです。代わりに、nib を (おそらく viewDidLoad で) 登録してから、使用している古いメソッドの代わりに dequeueReusableCellWithIdentifier:forIndexPath: メソッドを使用する必要があります。このメソッドは常にセルをデキューすることが保証されているため、if cell == nil 句は必要ありません。

于 2013-02-14T21:51:47.283 に答える
0

UITableViewCell *cell オブジェクトが nil (つまり、デキューするものがあったかどうか) かどうかを確認する必要があります。その場合は、新しいものを割り当ててください。

于 2013-02-14T21:44:35.700 に答える