2011-09-05 90 views
5

我通過以下代碼將youtube視頻縮略圖嵌入到我的UITableView單元中。但是,每當我滾動表格時,視頻縮略圖將在單元格離開屏幕並返回時重新加載。在UITableViewCell中嵌入YouTube視頻:如何緩存以防止重新加載?

什麼是緩存縮略圖的最有效方式,以便它們只能第一次加載?

- (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

在theese情況下,你可以(在第一次分配web視圖)與對象web視圖與objc_setAssociatedObject的searchResultArray關聯。

的一點是,因爲cellFoRowAtIndexPath被稱爲每次細胞變得可見,你不應該初始化web視圖那裏,但是當你初始化它們這樣做時間:

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是靜態字符,必須是全局的類。