objective-c - 滚动时表格单元格内容损坏

标签 objective-c ios uitableview

我有一个 UITableView,其中的单元格中有一个 UIWebView,我的表格有 2 个问题。首先,Web View 覆盖了它所在的单元格,因此它使单元格看起来有点奇怪。

第二个更严重的问题也是该线程的主要问题是滚动表格时发生的损坏。 Web View 将随机呈现在错误的单元格中,我滚动得越快,就越多的单元格像这样损坏。如果我缓慢滚动,一切都会按应有的方式呈现。

最初绘制表格时,它会正确呈现。当用户滚动表格时,它只会开始变坏。当它搞砸时,UIWebView 会出现在某些不应该出现的单元格上。除非您滚动缓慢,否则会发生这种情况,并且滚动得越快,情况就越糟。这不仅仅是一个图形故障,因为在这些单元格中不应该有一个事件的实时 Web View 。我还注意到我的单元格附件图标在第一个单元格上也从无变为显示三角形。我试着张贴了一些这方面的图片,但我太新了,不能被允许(垃圾邮件发送者破坏了每个人的乐趣)

这是我的 cellForRowAtIndexPath 代码。请温柔点,我只是在学习这一切是如何工作的。 :)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifierMediaType];
    switch ([indexPath section]) {
        case 0: {
            if (!cell) {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierLongDescription];
            }
            [cell.contentView addSubview:self.longDescriptionWebView];
            break;
        }
        case 1: {
            if (!cell) {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierMediaType];
            }
            NSDictionary *cellDict = [self.subMediaTypes objectAtIndex:[indexPath row]];
            cell.textLabel.text = [cellDict objectForKey:@"SHORT_DESCRIPTION"];
            break;
        }    
        default:
            if (!cell) {
                cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierMediaType];
            }
            break;
    }

    return cell;
}

首先,我尝试在 cellForRowAtIndexPath 中定义重用单元格,但结果相同,所以我将单元格移出并将它们设置为实例变量。这也有效,但我仍然有损坏问题,所以我猜我在哪里设置重用单元真的无关紧要。这是我设置重用单元的代码块。

if (!self.mediaTypeCell) self.mediaTypeCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierMediaType];
if (!self.longDescriptionCell) self.longDescriptionCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierLongDescription];
if (!self.longDescriptionWebView) self.longDescriptionWebView = [[UIWebView alloc] initWithFrame:self.longDescriptionCell.bounds];
self.mediaTypeCell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
self.longDescriptionCell.accessoryType = UITableViewCellAccessoryNone;
[self.longDescriptionCell.contentView addSubview:self.longDescriptionWebView];
self.longDescriptionCell.contentView.autoresizesSubviews = YES;
self.longDescriptionWebView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.longDescriptionWebView loadHTMLString:self.mediaTypeLongDescription baseURL:nil];

表格只需要两种类型的单元格。有一个没有附件的单元格包含 Web View (longDescriptionCell),表格的其余部分包含包含带有披露指示器附件的简单文本字符串 (mediaTypeCell) 的单元格。

最佳答案

那么……我们应该从哪里开始……?

通常,在单元格内使用 uiwebview(即 uiscrollview)不是一个好主意。 但这并非不可能,你只需要关心它,所以,如果你只是想学习如何使用表格,你可以从更简单的事情开始......

顺便说一下,你犯的更大错误:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// (..)
       if (!cell) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifierLongDescription];
        }
        [cell.contentView addSubview:self.longDescriptionWebView];
// (..)
} 

每次您的表格需要显示一个单元格时都会使用和调用此协议(protocol)方法,因此它会在第一次显示时(对于每个单元格)以及用户向下和向上滚动时运行。

表格的神奇之处在于重用在屏幕外向上移动的单元格(如果用户向下滚动),以在向下数据所需的新数据下重用相同的单元格。

这就是你应该问这样的问题的方式:

   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifierMediaType];

该代码只是询问是否有一个未使用的单元格可用于我们需要的新数据。 此时,如果它不存在,我们需要分配一个新的并设置它的对象以显示正确的数据。

但是如果它存在我们不需要分配一个新的(这就是你正在做的,好的) 并且我们应该在其中添加新对象(或者如果我们这样做,我们应该删除其中的旧对象)

你在每次滚动时添加一个 web View ,将它添加到旧的 View 之上,这样:

       [cell.contentView addSubview:self.longDescriptionWebView];

这是个大错误,你应该重用旧的 webView 告诉它加载一个新的 html 页面(或者你在其中显示的其他内容)

还有一件事:当你使用

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifierMediaType];

你要求一个 id 为 CellIdentifierMediaType 的现有单元格

但随后您询问并使用了不同的 id 单元格 (CellIdentifierLongDescription)

关于objective-c - 滚动时表格单元格内容损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10860088/

相关文章:

objective-c - 如何从 NSIndexset 获取索引到 cocoa 中的 NSArray?

ios - 获取 json 数据后以编程方式设置 UITableViewCell 高度

uitableview - 如何使用 Monotouch 更改 DetailTextLabel 的颜色?

ios - 检测用户是否在车内移动

iOS 7.1 拥有比文档中列出的更多的 CoreImage 滤镜(例如 CIBumpDistortion 和 CIBumpDistortionLinear)。我们可以使用它们吗?

objective-c - 为我的 iPhone 应用程序使用 xcode 4.2 编译链接错误

ios 在最后一个索引之后插入更多表格单元格行

ios - swift - 如何在 iOS tableView 上禁用点击历史记录

ios - 前景和背景,哪些应用程序在哪里?

iphone - 从 SQLITE 数据库中删除数据的 Objective-C 问题 - 结果代码 5