在 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 headerview 的 UIView 中添加动态图像