2011-09-05 6 views
5

私はあなたのUITableViewセルに次のコードを使ってYouTubeビデオサムネイルを埋め込みます。ただし、テーブルをスクロールするたびに、セルが画面を離れて戻るときにビデオサムネイルがリロードされます。UITableViewCellの埋め込みYouTube動画:リロードを防ぐためにキャッシュする方法は?

サムネイルを最初に読み込むようにキャッシュする最も効率的な方法は何ですか? theese状況で

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString* PlaceholderCellIdentifier = @"PlaceholderCell"; 

    SearchResult *searchResult = [self.searchResultArray objectAtIndex:indexPath.row]; 

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:PlaceholderCellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:PlaceholderCellIdentifier]autorelease]; 
     UIWebView *videoView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 104, 104)]; 
     videoView.tag = 1; 
     cell.imageView.image = [UIImage imageNamed:@"Placeholder"]; 

     [cell.contentView addSubview:videoView]; 
     [videoView release]; 
    } 

    UIWebView *thisVideoView = (UIWebView *)[cell.contentView viewWithTag:1]; 
    NSString *videoHTML = [self embedYouTube:searchResult.url frame:CGRectMake(0, 0, 104, 104)]; 
    [thisVideoView loadHTMLString:videoHTML baseURL:nil]; 

    return cell; 
} 


- (NSString*)embedYouTube:(NSString*)url frame:(CGRect)frame { 
    NSString* embedHTML = @"\ 
    <html><head>\ 
    <style type=\"text/css\">\ 
    body {\ 
    background-color: transparent;\ 
    color: white;\ 
    }\ 
    </style>\ 
    </head><body style=\"margin:0\">\ 
    <embed id=\"yt\" src=\"%@\" type=\"application/x-shockwave-flash\" \ 
    width=\"%0.0f\" height=\"%0.0f\"></embed>\ 
    </body></html>"; 
    NSString* html = [NSString stringWithFormat:embedHTML, url, frame.size.width, frame.size.height]; 
    return html; 
} 
+0

質問の解決方法や回避策を見つけましたか? – Alix

答えて

0

することができますobjc_setAssociatedObjectとsearchResultArrayにオブジェクトとのWebViewを関連付ける(最初のWebView割り当てた後)。

cellFoRowAtIndexPathは、あなたがそこのWebViewを初期化するべきではないと、セルが目に見えるようになるたびに呼び出されますが、あなたがそれらを初期化する際にあなたがしているのでポイントは、次のとおりです。

objc_setAssociatedObject([searchResultArray valueForKey:someIndex], &someKey, webView, OBJC_ASSOCIATION_RETAIN_NONATOMIC) 

、その後cellForRowAtIndexPathであなたが:

if (objc_getAssociatedObject([searchResultArray valueForKey:indexPath.row, &someKey) != nil) { 
    UIWebView *thisVideoView = (UIWebView *)[cell.contentView viewWithTag:1]; 
    *thisVideoView = objc_getAssociatedObject([searchResultArray valueForKey:indexPath.row, &someKey); 
} else { 
    ////empty webView or some loading indicator 
} 

準備ができたらいつでもWebViewsを初期化できます。 & someKeyは静的charであり、クラスに対してグローバルである必要があります。

関連する問題