1

UIWebView を含むセルを含む UITableView があり、テーブルに 2 つの問題があります。最初に、Web ビューがそのセルをカバーしているため、セルが少し奇妙に見えます。

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];

テーブルには 2 種類のセルのみが必要です。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ページ(または他に表示されているもの)をロードするように指示する必要があります。

もう1つ:使用するとき

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifierMediaType];

IDがCellIdentifierMediaTypeの既存のセルを要求します

ただし、異なるIDセルも要求して使用します(CellIdentifierLongDescription)

于 2012-06-02T07:22:14.193 に答える