1

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

第二个更严重的问题和该线程的主要问题是滚动表格时发生的损坏。Web 视图将随机呈现在错误的单元格中,并且滚动得越快,越多的单元格会像这样损坏。如果我慢慢滚动,一切都会像它应该的那样呈现。

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

这是我的 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 视图 (longDescriptionCell),而表格的其余部分包含包含带有披露指示符附件的简单文本字符串 (mediaTypeCell) 的单元格。

4

1 回答 1

0

所以......我们应该从哪里开始......?

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

顺便说一句,你正在做的更大的错误:

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

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

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

这样你就应该问这样的问题:

   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifierMediaType];

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

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

您每次滚动时都会添加一个 Web 视图,将其添加到旧视图上,如下所示:

       [cell.contentView addSubview:self.longDescriptionWebView];

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

还有一件事:当你使用

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifierMediaType];

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

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

于 2012-06-02T07:22:14.193 回答