2011-09-05 34 views
5

Tôi đang nhúng hình thu nhỏ video trên YouTube vào Ô UITableView của mình thông qua mã sau đây. Tuy nhiên, bất cứ khi nào tôi cuộn bảng, hình thu nhỏ video sẽ tải lại khi ô rời khỏi màn hình và trả về.Video được nhúng trên YouTube trong UITableViewCell: Cách cache để ngăn tải lại?

Cách hiệu quả nhất để lưu vào bộ nhớ cache hình thu nhỏ để chúng chỉ tải lần đầu tiên?

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

Bạn đã tìm ra câu trả lời cho câu hỏi của mình hay cách giải quyết khác – Alix

Trả lời

0

Trong trường hợp này bạn có thể (sau khi phân bổ lần đầu webView) liên kết webXem với đối tượng trong tìm kiếmResultArray với objc_setAssociatedObject.

Vấn đề là, kể từ khi cellFoRowAtIndexPath được gọi mỗi khi các tế bào trở nên rõ ràng, rằng bạn không nên khởi tạo webview ở đó, nhưng khi bạn khởi tạo chúng bạn làm:

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

và sau đó trong cellForRowAtIndexPath bạn làm :

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 
} 

Bạn có thể khởi tạo webView bất cứ khi nào bạn sẵn sàng. & someKey là char tĩnh và phải là toàn cục đối với lớp.

Các vấn đề liên quan