0

我有这个非常奇怪的问题。

基本上我有一个 UITableViewCell 子类,我编写了一些插座并将其链接到一个 Nib。

Cell.h 的子类

@property (weak, nonatomic) IBOutlet UIImageView *myImageView;

Cell.m 的子类

@synthesize myImageView = _myImageView; // do i need this?


- (void) setUpCell... image:(UIImage*)image
{
       if(image)
        self.myImageView.image = image;
    else
        self.myImageView.image = nil;
} 

在管理单元格的表格视图的视图控制器中,

我已使用以下代码向 Nib 注册:

[self.tableView registerNib:[UINib nibWithNibName:pathToNibForBaseMenuCell bundle:nil] forCellReuseIdentifier:identifierForBaseMenuCell];

在 cellForRowAtIndexPath 中,我将单元格出列并设置图像...

CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:identifierForBaseMenuCell];

switch (indexPath.section) {


    case 2:
        [cell setUpCell...image:self.cogWheelImageForSettingsIcon];
        break;

    default:
        break;
}

return cell;

}

奇怪的是,假设我在第 2 部分中有 10 个单元格(如上),我以相同的方式设置它们,有些单元格显示齿轮图标,有些则没有!将这些单元格滚动进出视图似乎会改变哪些单元格显示图标而哪些不显示。

这意味着注册单元格,包括设置重用标识符,在 nib 文件中设置子类,所有这些都很好(常见的陷阱)。

在我看来,这种行为模式与内存有关 - 好像某处正在释放某些东西......

这是一张图片来说明我的意思:

在此处输入图像描述

请帮忙!

谢谢

维生素B

编辑:

好吧,明确一点,我还没有在这张表上使用任何数据,但尽管如此,我没有理由不应该出现这些齿轮!

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 3;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 {
switch (section) {
    case 0:
        return 1;
        break;

    case 1:
        return 10;
        break;

    case 2:
        return 10;
        break;

    default:
        return 0;
        break;
}
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:identifierForBaseMenuCell];

switch (indexPath.section) {
    case 0:
        [cell setUpCell... text:@"Username" image:nil];
        break;

    case 1:
        [cell setUpCell... text:@"Magazine" image:nil];
        break;

    case 2:
    {
        NSString* str = [NSString stringWithFormat:@"Settings: %d",indexPath.row];
        [cell setUpCell... text:str image:self.cogWheelImageForSettingsIcon];
        break;
    }

    default:
        break;
}

return cell;
}

它的输出是......

在此处输入图像描述

我的观点是,如果我为第二部分“设置”中的所有单元格设置相同的图像,为什么只有其中一些单元格显示图像?

自定义单元类:

@interface CustomCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UIImageView *backgroundImageView;
@property (weak, nonatomic) IBOutlet UILabel *mainLabel;
@property (weak, nonatomic) IBOutlet UILabel *arrowView;
@property (weak, nonatomic) IBOutlet UIImageView *myImageView;
- (void) setUpCelltext:(NSString*)text image:(UIImage*)image;


@implementation CustomCell

- (void) setUpCelltext:(NSString*)text image:(UIImage*)image
{
self.backgroundImageView.image = [UIImage imageNamed:pathForBackgroundImage];
self.myImageView.layer.cornerRadius = kCornerRadiusOfImageView;
self.myImageView.layer.masksToBounds = YES;

if(image)
    self.myImageView.image = image;
else
    self.myImageView.image = nil;

NSDictionary *attrsDictionary = [NSDictionary dictionaryWithObject:self.fontForText forKey:NSFontAttributeName];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:text attributes:attrsDictionary];
self.mainLabel.attributedText = attrString;
}
@end

单元格有自定义字体、箭头视图、背景视图——它们都可以正常工作!它们根据部分而变化。它只是不起作用的图像。您可以看到 cellForRowAtIndexPath 调用的此函数将设置图像(如果提供),或者将 imageview 设置为 nil(如果不提供)。

4

2 回答 2

1

事实证明,问题与在我的笔尖中使用“imageView”作为我的 imageView 的名称有关。这后来被改变了,但原来的关系是 UITableViewCell 的实例变量而不是自定义单元格。

故事的寓意:不要将自定义表格视图单元格的图像视图称为“imageView”!

于 2013-04-04T12:10:59.950 回答
0

UITableViewCells 使用 . 从旧单元格中重绘dequeueReusableCellWithIdentifier:。如果您不希望重复使用单元格,那么您将需要每次在tableView:cellForRowAtIndexPath:函数中初始化一个新单元格。

但是,如果您想重用单元格(推荐),那么您应该- (void) setUpCell... image:(UIImage*)image每次都在您的内部调用您的函数tableView:cellForRowAtIndexPath:,以确保图像仅设置为正确的单元格。

您似乎也在使用存储在UITableViewCell子类中的数据,但是当单元格在不同的行上重用时,它仍然会认为它是与原始行相同的单元格。

例如:在第 2 行中创建了一个单元格,并具有一个图标图像。单元格 2 不在屏幕上,现在正用于第 16 行。第 16 行不应该有图像,但单元格仍然认为它与第 2 行中的单元格相同,并继续显示其图像。

如果您希望重复使用每个单元格并为每个单元格提供唯一数据,请仅使用外部数据集(例如: an NSArray),该数据集提供绘制单元格所需的信息并将该信息每次传递给单元格,而不是依赖于您在创建单元格时提供的信息。

于 2013-03-27T16:32:14.837 回答