当我滚动我的自定义UITableviewCells时获取错误的内容(另一个单元格的文本)。这是随机发生的。我试着清理细胞然后我得到一些空白细胞。我的代码如下。任何人都可以告诉我发生了什么。我从这里和其他地方读过许多文章,需要清除单元格,但没有一个对我有用,因为我不确定你清除数据的时间点。我甚至尝试在我的小组课上实现prepareForReuse,但没有好处。
- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if ([self.products count] == 0) {
UITableViewCell *cell = [[UITableViewCell alloc] init];
return cell;
}
static NSString *CellIdentifier = @"AvailableCustomerProductCell";
AvailableCustomerProductTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
cell.accessoryType = UITableViewCellAccessoryNone;
cell.buttonAdd.tag = indexPath.row;
[cell.buttonAdd addTarget: self action: @selector(addToSelectedProduct:) forControlEvents: UIControlEventTouchUpInside];
Product *prod = nil;
if (theTableView == self.searchDisplayController.searchResultsTableView) {
prod = (Product *)[self.filteredProducts objectAtIndex:indexPath.row];
} else {
prod = (Product *)[self.products objectAtIndex:indexPath.row];
}
if (prod != nil) {
cell.pNumber.text = prod.number;
cell.description.text = prod.desc;
if ([Common getProductPromotion:prod] != nil) {
cell.btnPromotionTag.hidden = NO;
cell.btnPromotionTag.tag = indexPath.row;
[cell.btnPromotionTag addTarget: self action: @selector(showPromotionDetails:) forControlEvents: UIControlEventTouchUpInside];
}
else{
cell.btnPromotionTag.hidden = YES;
}
//Get the customer product price, first:
//If if the product has a record in the productCustomerPrices list
//if not get the price from the standard price.
if (self.order.orderOrderCustomer != nil) {
CustomerPrice *custPrice = [Common getPriceForCustomer:self.order.customerRef forProduct:prod.productId];
if (custPrice != nil) {
//get the customer price
[cell.btnPrice setTitle:[Common getCurrencyFormattedStringFromFloat:[custPrice.price floatValue]] forState:UIControlStateNormal];
[cell.btnPrice setTitleColor:[UIColor colorWithRed:0.01 green:0.65 blue:0.77 alpha:1] forState:UIControlStateNormal];
cell.btnPrice.enabled = NO;
}else{
//get the standard price
float price =[[Common GetProductStandardPrice:prod.productStanddardPrices ByQuantity:[NSNumber numberWithInt:1]] floatValue];
[cell.btnPrice setTitle: [Common getCurrencyFormattedStringFromFloat:price] forState:UIControlStateNormal ];
[cell.btnPrice setTitleColor:[UIColor colorWithRed:1.0 green:0.39 blue:0.0 alpha:1] forState:UIControlStateNormal];
cell.btnPrice.tag = indexPath.row;
[cell.btnPrice addTarget: self action: @selector(showStandardPrices:) forControlEvents: UIControlEventTouchUpInside];
cell.btnPrice.enabled = YES;
}
}
}
UISwipeGestureRecognizer* sgr = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(cellSwiped:)];
[sgr setDirection:UISwipeGestureRecognizerDirectionRight];
[cell addGestureRecognizer:sgr];
return cell;
}
答案 0 :(得分:1)
您的问题几乎肯定与表格视图回收单元格相关。这就是细胞需要被清除的原因#34;正如你所说的那样。
例如,如果顶部附近有一个显示图像的单元格,如果向下滚动并且同一个单元格用于显示不应该有图像的单元格,那么该图像仍将显示除非您已将其删除,否则会显示。即使您要显示100个单元格,也可能只有少数实例存在 - 它们会被回收。
话虽如此,即使你没有说出哪些文字仍在显示,如果prod
是nil
,它可能是各种对象,包括pNumber
和description
。如果self.order.orderOrderCustomer
为nil
,则同样如此。为了避免这样的事情,你可以在获得cell
之后立即输入以下内容:
cell.pNumber.tex = @"";
cell.description.text = @"";
//etc
另一个注意事项:您正在向您的手机的buttonAdd
按钮添加目标。您应该删除之前的行上的现有操作。例如:
[cell.buttonAdd removeTarget:nil action:NULL forControlEvents:UIControlEventAllEvents];
[cell.buttonAdd addTarget: self action: @selector(addToSelectedProduct:) forControlEvents: UIControlEventTouchUpInside];
同样适用于btnPromotionTag
和btnPrice
。
答案 1 :(得分:1)
确保在每次cellForRowAtIndexPath
次呼叫中重置某个小区的状态。你有一堆if / else条件,并且控制流程使得在单元格上设置内容的代码根本不被调用,这就是为什么来自以前重用的单元格的内容仍然存在的原因。
我的规则是始终为if
s匹配其他条件,我改变单元格的状态(如果没有,那么至少为空)。如果是UITableViewCell
子类,您可以在prepareForReuse
答案 2 :(得分:0)
通常,如果有数百条记录,最好对所有单元使用相同的标识符,以便单元可以重用内存。否则,如果Tableview足够长并且用户快速滚动它,将导致大量的allocs / deallocs,这将导致不平滑的滚动。然后始终将行特定代码放在检查单元格为 nil 的条件之外。
看一下这段代码:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *cellIdentifier = @"MY_CELL_IDENTIFIER";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
// Everything that is similar in all the cells should be defined here
// like frames, background colors, label colors, indentation etc.
}
// everything that is row specific should go here
// like image, label text, progress view progress etc.
return cell;
}