在 UITableViewCell 中动态显示图像

Posted

技术标签:

【中文标题】在 UITableViewCell 中动态显示图像【英文标题】:Dynamically display an image in a UITableViewCell 【发布时间】:2012-02-14 16:04:58 【问题描述】:

我有一个 UITableViewCell,它是滚动禁用的,并且有固定的部分和行。

有两个部分,第 0 部分有 1 行,第 1 部分有几行。

tableView是供用户做一些选择的。

所以,第一部分(只有一行)将显示用户选择的结果,

毫无疑问,第二部分(有几行)是供选择的。

现在我想在第一部分唯一一行的单元格中放一张图片,

并且此图像会根据用户的选择而变化。

判断应该显示哪个png图像很容易,但是我更新它时遇到了麻烦。

我尝试使用单元格的 imageView,并在那里手动分配 UIImageView 或 UIView 来显示这些图像。

但是所有这些都不起作用,我的意思是它们只是保留开始时显示的内容并且从不更改它,即使我将视图的背景或其图像设置为新的 png。

我尝试了一些方法,例如

[myImage setNeedsDisplay] 用于手动分配的视图,

[thatCell setNeedsDiaplsy] & [self.tableView reloadData] 用于该单元格的 imageView,

但徒劳无功。

所以我想知道如何实现这个在不同情况下的功能?

非常感谢!

_____更新行_____强>

很抱歉我没有提供我的代码。

他们就在这里。

- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath 
     static NSString *inOutTableCellIdentifier = @"DealTableViewIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:inOutTableCellIdentifier];
if (cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1
                                   reuseIdentifier:inOutTableCellIdentifier] autorelease];
    cell.textLabel.font = [UIFont fontWithName:cMyFont size:[UIFont systemFontSize]];
    cell.detailTextLabel.font = [UIFont fontWithName:cMyFont size:[UIFont smallSystemFontSize]];
     // I tried using both imageView and UIView here, but won't work

     if (indexPath.section == 0)    
        //cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"moneyCell.png"]];
        cell.backgroundColor = [UIColor cyanColor];
       // cell.imageView.image = [UIImage imageNamed:@"dealDone2.png"];
        self.undoneIcon = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)] autorelease];
        //self.undoneIcon.image = [UIImage imageNamed:@"dealUndone2.png"];
        self.undoneIcon.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"dealUndone2.png"]];
        [cell.contentView addSubview:self.undoneIcon];
        ....  // deal with other rows in section 1
        return cell;
 
// and this is the method that update the image, the images are named "dealDoneX.png",
// where X is an integer from 0 to 4.
- (void)checkUndoneDegree   // here I also tried 2 ways corresponding to UIView or a cell's imageView, but neither works well.
int i = 0;
if (self._date)
    i++;
if (self.moneyTextField.text)
    i++;

if (self._incomingAccount)
    i++;
if (self._expensingAccount)
    i++;
if (_dealType != kTransferView)
    if (self._type)
        i++;
NSLog(@"undone degree: %d",i);
NSString *imageName = [@"dealUndone" stringByAppendingFormat:@"%d",i];
self.undoneIcon.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:imageName]];
[self.undoneIcon setNeedsDisplay];
//    NSUInteger p[2] = 0,0;
//    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath    indexPathWithIndexes:p length:2]];
//    [cell setNeedsDisplay];

每次我更新表格的数据,比如改变一些单元格的文本,

我会调用 [self checkUndoneDegree] 然后调用 [self.tableView reloadData],

但图片永远不会更新,至少从屏幕上看是这样。

我什至尝试将决定设置哪个 png 的代码放在

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

方法,但它只能使视图显示第一个png,没有任何更新。

感谢您的帮助!

【问题讨论】:

在我看来,如果您正在测试 tableView:cellForRowAtIndexPath: 中的部分/行,它应该可以工作。也许你错过了一些简单的东西?尝试在该方法中进行调试,看看它是否按预期被调用。其他一切听起来都不错 - 除了在动态表中,我做同样的事情,它工作得很好。 你给我们看一些代码怎么样? 向我们展示如何使用图像视图创建单元格的代码。 @DamienDelRusso ,谢谢提醒,我现在放了一些代码。 @lawicko,谢谢提醒,我这里放了一些代码。 【参考方案1】:
    使您的 undoDegree(由代码中的 i 变量表示)成为视图控制器的 ivar,因此它可以在所有方法中访问,也可以在 UITableView 中访问委托和数据源方法。 忘记 setNeedsDisplay 方法。由于您使用 UITableView 来显示您的内容,因此您需要遵守其规则。这意味着您应该使用reloadSections:withRowAnimation: 方法。 如果需要self.undoneIcon,请再次检查。我很确定 imageView 属性应该可以。也就是说,如果您真的想在单元格中显示图像。如果您想通过操作单元格的背景来创建某种进度条,请使用backgroundView 属性,或者将UIProgressView 放在您的单元格中。在查看您的代码之后,这就是我认为您想要做的事情。

【讨论】:

非常感谢! ImageView 有效,但问题实际上是我对 png 的名称犯了一个愚蠢的错误……哈哈

以上是关于在 UITableViewCell 中动态显示图像的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 高度问题

UITableViewCell中带有图像的动态标签?

在 UITableviewcell headerview 的 UIView 中添加动态图像

UITableViewCell内的iOS UICollectionView

在 UITableviewCell 中的气泡上显示图像

UIImageView 未在自定义 UITableViewCell 中显示图像