自定义UITableViewCell重新创建自己

时间:2012-10-16 16:40:08

标签: objective-c

真的需要帮助。我到处都看,但我仍然无法找到答案。因此,当我使用自定义单元格滚动我的UITableView时,每次我看到它时都会重新创建单元格。结果,它显着降低了我的表现。

我的方法

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *CellIdentifier = @"CellWithViewForProduct";
ProductCell *cell = (ProductCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
ProductDataStruct *dataStruct = [self.arrayData objectAtIndex:indexPath.row];
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"productCell" owner:nil options:nil];
    for(id currentObject in topLevelObjects)
    {
        if([currentObject isKindOfClass:[ProductCell class]])
        {
            cell = (ProductCell *)currentObject;
            break;
        }
    }
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.roundingIncrement = [NSNumber numberWithDouble:0.01];
formatter.numberStyle = NSNumberFormatterDecimalStyle;

NSString *price = [formatter stringFromNumber:[NSNumber numberWithFloat:(dataStruct.price.floatValue * [[[NSUserDefaults standardUserDefaults] objectForKey:@"CurrencyCoefficient"] floatValue])]];
NSString *priceString = [NSString stringWithFormat:@"%@ %@", price, [[NSUserDefaults standardUserDefaults] objectForKey:@"Currency"]];

cell.productPrice.text = priceString;
cell.productDescription.text = [NSString stringWithFormat:@"%@", dataStruct.descriptionText];
cell.productTitle.text = [NSString stringWithFormat:@"%@", dataStruct.title];

if (dataStruct.hit.integerValue == 1)
{
    [cell.productImage.layer addSublayer:[hitView layer]];
}
else
    if (dataStruct.hit.integerValue == 2)
        [cell.productImage.layer addSublayer:[newsItemView layer]];

if (!dataStruct.image)
{
    if (self.tableView.dragging == NO && self.tableView.decelerating == NO && dataStruct.link)
    {
        [self startIconDownload:dataStruct forIndexPath:indexPath];
    }
    // if a download is deferred or in progress, return a placeholder image  
    //cell.productImage.image = [UIImage imageNamed:@"Placeholder.png"];

    // if a download is deferred or in progress, return a loading screen
    cell.productImage.alpha = 0;
    [cell.productImageLoadingIndocator startAnimating];

}
else
{
    if (self.didLoad)
    {
        cell.productImage.alpha = 0;
    }
    [cell.productImageLoadingIndocator stopAnimating];
    cell.productImage.image = dataStruct.image;
    [self imageAnimation: cell.productImage];
}
NSLog(@"WAZAAA");
return cell;
}

2 个答案:

答案 0 :(得分:1)

这整段代码:

NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"productCell" owner:nil options:nil];
for(id currentObject in topLevelObjects)
{
    if([currentObject isKindOfClass:[ProductCell class]])
    {
        cell = (ProductCell *)currentObject;
        break;
    }
}

对我来说似乎不对。在它之上,

ProductCell *cell = (ProductCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

应该足以让你使用一个单元格。

答案 1 :(得分:0)

首先在@property (nonatomic, assign) IBOutlet ProductCell *prodCell;

中创建.h

然后在.m中你只需要这个

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

NSString *CellIdentifier = @"CellWithViewForProduct";

    ProductCell *cell = (ProductCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {

        [[NSBundle mainBundle] loadNibNamed:@"productCell" owner:self options:nil];

        cell = prodCell;

        self.prodCell = nil;
        NSLog(@"WAZAAA"); //Now it will only be called when a new cell is created.
    }

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.roundingIncrement = [NSNumber numberWithDouble:0.01];
formatter.numberStyle = NSNumberFormatterDecimalStyle;

NSString *price = [formatter stringFromNumber:[NSNumber numberWithFloat:(dataStruct.price.floatValue * [[[NSUserDefaults standardUserDefaults] objectForKey:@"CurrencyCoefficient"] floatValue])]];
NSString *priceString = [NSString stringWithFormat:@"%@ %@", price, [[NSUserDefaults standardUserDefaults] objectForKey:@"Currency"]];

cell.productPrice.text = priceString;
cell.productDescription.text = [NSString stringWithFormat:@"%@", dataStruct.descriptionText];
cell.productTitle.text = [NSString stringWithFormat:@"%@", dataStruct.title];

if (dataStruct.hit.integerValue == 1)
{
    [cell.productImage.layer addSublayer:[hitView layer]];
}
else
    if (dataStruct.hit.integerValue == 2)
        [cell.productImage.layer addSublayer:[newsItemView layer]];

if (!dataStruct.image)
{
    if (self.tableView.dragging == NO && self.tableView.decelerating == NO && dataStruct.link)
    {
        [self startIconDownload:dataStruct forIndexPath:indexPath];
    }
    // if a download is deferred or in progress, return a placeholder image  
    //cell.productImage.image = [UIImage imageNamed:@"Placeholder.png"];

    // if a download is deferred or in progress, return a loading screen
    cell.productImage.alpha = 0;
    [cell.productImageLoadingIndocator startAnimating];

}
else
{
    if (self.didLoad)
    {
        cell.productImage.alpha = 0;
    }
    [cell.productImageLoadingIndocator stopAnimating];
    cell.productImage.image = dataStruct.image;
    [self imageAnimation: cell.productImage];
}
NSLog(@"WAZAAA"); //Here doesn't make any sense, the cell is returned for being displayed, this doesn't mean it's being created.
return cell;
}