Objective C UITableView - 更改单元格高度后表格单元格显示错误内容

Posted

技术标签:

【中文标题】Objective C UITableView - 更改单元格高度后表格单元格显示错误内容【英文标题】:Objective C UITableView - Table cells display wrong content after changing cell's height 【发布时间】:2011-07-02 03:26:57 【问题描述】:

我正在尝试在 xcode 中构建一个应用程序,该应用程序 - 除了其他人 - 读取 rss 提要并显示帖子。我是 Objective-c 的新手,有时会觉得有点难。

我对检索到的故事(帖子)使用 NSMutableArray。每个故事都由一个 NSMutableDictionary 表示,其中包含帖子的标题、主题、日期和链接。所有这些都显示在 UIViewController 内的 UITableView 中。 我已经定制了自己的单元格,所以我可以在其中显示多个标签。

我的问题是,如果我使用 tableView:heightForRowAtIndexPath:,前 5 个单元格(适合屏幕)显示正常,但如果向下滚动,下一个单元格似乎与前 5 个单元格具有相同的内容(即单元格 0- 4 显示正常,单元格 5 有单元格 0 的内容,单元格 1 的单元格 6 等)!如果我删除 tableView:heightForRowAtIndexPath: 一切都很好(除了没有我想要的单元格大小)

以下是代码的外观:

//  NavigationContentsViewController.h
@interface NavigationContentsViewController :
UIViewController <UITableViewDelegate, UITableViewDataSource> 

    UITableView *myTableView;
    IBOutlet UITableView * newsTable;
    UIActivityIndicatorView * activityIndicator;
    CGSize cellSize;
    NSXMLParser * rssParser;
    NSMutableArray * stories; 
    NSMutableDictionary * item; // it parses through the document, from top to bottom...

    NSString * currentElement;
    NSMutableString * currentTitle, * currentDate, * currentSummary, * currentLink;



@property(nonatomic,retain)NSMutableArray *itemsList;
@property(nonatomic,retain)UITableView *myTableView;
- (void)parseXMLFileAtURL: (NSString *)URL;

.

//NavigationContentsViewController.m
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

// Configure the cell.
static NSString *MyIdentifier = @"MyIdentifier";
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];

if (cell == nil)
    cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
    // Set up the cell 
    int storyIndex = indexPath.row;
    //[cell setText:[[stories objectAtIndex: storyIndex] objectForKey: @"title"]];
    //Story title
    //cell.textLabel.text = [[stories objectAtIndex: storyIndex] objectForKey: @"title"];
    //cell.textLabel.font = [UIFont boldSystemFontOfSize:14];
    cell.lTitle.text = [[stories objectAtIndex: storyIndex] objectForKey: @"title"];
    cell.lSummary.text = [[stories objectAtIndex: storyIndex] objectForKey: @"summary"];
    cell.lDate.text = [[stories objectAtIndex: storyIndex] objectForKey: @"date"];

    return cell;


return cell;


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

    NSString *selectedCellItem = [NSString stringWithFormat:@"%d", indexPath.row];

    TableViewController *fvController = [[TableViewController alloc] initWithNibName:@"TableViewController" bundle:[NSBundle mainBundle]];
    fvController.selectedCellItem = selectedCellItem;
    [self.navigationController pushViewController:fvController animated:YES];
    [fvController release];
    fvController = nil; 


-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    return 80;

有什么线索吗? [编辑:更改 int storyIndex = indexPath.row;]

【问题讨论】:

你能解释一下为什么你使用int storyIndex = [indexPath indexAtPosition:[indexPath length] - 1];而不是int storyIndex = indexPath.row;吗? 如果涉及部分,它确实会有点复杂......在这种情况下,我建议您为每个部分创建多个 NSMutableArrays(但话又说回来,您可能必须创建一个更大的数组来存储它,或者如果它变得太大,你将不得不直接从磁盘开始加载)。 @NR4TR 首先感谢您打扰我的问题!正如所写,这是我第一次处理 obj-c,所以很多时候我可能会使用错误的东西,或者用奇怪的方式做事。只是看了你的推荐,我觉得很傻......无论如何,这并没有改变我的问题:) 我从未使用过 indexAtPosition,我不确定它会返回什么,但我相当肯定它会返回当前屏幕上的单元格的索引,这是导致您的问题。如果您的表格视图中没有部分,则只需使用 indexPath.row。 @Inspire48 我有点困惑。多个 NSMutableArrays 将如何解决问题?事实上,它不会解决它,我只是改变做事的方式。为什么改变单元格的高度与单元格的内容有关?或者 heightForRowAtIndexPath 不仅仅与单元格的高度有关? (顺便感谢您的回复) 【参考方案1】:

使用 [indexPath indexAtPosition...] 很可能是您的错误来源——它没有获得正确的索引路径。

但是,如果您正在创建 CustomCell(希望在 IB 中?),那么您应该在 IB 中设置单元格的大小,而不是在代码中进行。

【讨论】:

将使用 [indexPath indexAtPosition...] 的部分更改为 int storyIndex = indexPath.row;但没有发生任何变化。但我仍然很好奇,为什么改变高度与单元格内容有关,如果删除 heightForRowAtIndexPath 一切都很好。我在 xcode 中而不是在 IB 中创建了 CustomCell。有没有其他方法可以设置单元格高度(CustomCell.m 中的 maeby)? 您是否通过继承 UITableViewCell 并使用 initWithFrame: 等方法添加标签来创建 CustomCell?在这种情况下,请在 CustomCell.m 中设置单元格的大小,因为它不会改变。 indexPath.row 工作正常 - 因为 [indexPath indexAtPosition:[indexPath length] - 1] 也工作。只是更改高度时内容错误(即使我使用 indexPath.row)我如何设置 CustomCell.m 内的大小(正如你所说的是 UITableViewCell 的子类)? 在默认初始化中设置其框架;或者您可以使用适当的 initWithFrame。 Apple 的官方文档在这里实际上很有帮助;向下滚动大约三分之一到“自定义单元格”的位置:developer.apple.com/library/ios/#documentation/UserExperience/… 另请参阅本教程以在 IB 中添加自定义单元格:iphone.galloway.me.uk/iphone-sdktutorials/… 不客气!抱歉,我没有抓住真正的问题——我太习惯于模板代码,以至于没有意识到实际上你只是一个大括号太低了……【参考方案2】:

这是人们在重复使用表格单元格时经常遇到的问题。

此行尝试重用一个单元格。这意味着如果单元格 0 移出屏幕,它将被重新用作单元格 5:

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];

如果一个单元格不能被重复使用,你正在创建一个新单元格:

if (cell == nil)
    cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];

下一行是您的问题,只有在无法重复使用单元格时才设置单元格。这发生了 5 次(对于在表格可见时可见的单元格)。

但是您的表格之后想要显示的所有单元格都将是已包含内容的重用单元格。

    // Set up the cell 
    /*...*/

但别担心。这很容易解决。您必须将单元的创建与其配置分开。只需像这样移动一些代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    static NSString *MyIdentifier = @"MyIdentifier";
    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];

    if (cell == nil)
        cell = [[[CustomCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
    
    // whatever happened before. You have a valid cell at this point.

    // Set up the cell 
    int storyIndex = indexPath.row;
    //[cell setText:[[stories objectAtIndex: storyIndex] objectForKey: @"title"]];
    //Story title
    //cell.textLabel.text = [[stories objectAtIndex: storyIndex] objectForKey: @"title"];
    //cell.textLabel.font = [UIFont boldSystemFontOfSize:14];
    cell.lTitle.text = [[stories objectAtIndex: storyIndex] objectForKey: @"title"];
    cell.lSummary.text = [[stories objectAtIndex: storyIndex] objectForKey: @"summary"];
    cell.lDate.text = [[stories objectAtIndex: storyIndex] objectForKey: @"date"];
    return cell;


编辑:也许我下次应该阅读这个问题。但我想我仍然 100% 正确。

如果我删除 tableView:heightForRowAtIndexPath: 一切都很好(除了没有我想要的单元格大小)

我认为这是巧合。你有多少细胞?我猜大概是七八吧?一切都很好,因为您的所有单元格同时可见。所以没有必要重复使用一个单元格,它们都有应该有的内容。

【讨论】:

天哪!!!一切都和你描述的一样!现在它是有道理的。感谢您提供解决方案,并解释为什么会这样!

以上是关于Objective C UITableView - 更改单元格高度后表格单元格显示错误内容的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C UI之UITableView详解

iOS Objective C - UITableView 性能问题

如何在Objective c中将捕获图像添加到UITableView

如何从Objective c中的UITableView获取UILabel的多个值

为啥我们不能在 UITableView、Objective C 上检测到 UITouch 逻辑

如何使用Objective C在UItableView中增加UIView高度?