2012-10-16 112 views
0

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

我的方法

-(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; 
} 
+1

你说的“这是重新创建”的意思 - 这是什么重现呢?怎么样? – 2012-10-16 16:41:35

+0

单元格不是“每次创建”的。他们创建一次。 – 2012-10-16 16:42:37

+0

在表中我有40个元素。当我向下滚动时 - 消息出现80次 – NewObjective

回答

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

应该足以让你一个细胞使用。

0

首先创建的.h

一个@property (nonatomic, assign) IBOutlet ProductCell *prodCell;然后在.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; 
} 
+0

我可能错过了它,但是唯一一次我看到你使用这个属性的时候,它被设置为零 - 为什么这个属性是必要的? – Isaac

+0

该属性有一个IBOutlet,所以你可以将它链接到一个自定义单元笔尖。您只在单元格为零时从笔尖创建一个新单元 – jcesarmobile

+0

即使作为IBOutlet,我也没有看到您访问该属性 - 唯一一次'self.prodCell'出现在您的代码中的行是'self.prodCell =无;'。 – Isaac