Встроенные видео YouTube в UITableViewCell: как кэшировать, чтобы предотвратить перезагрузку? - PullRequest
5 голосов
/ 05 сентября 2011

Я встраиваю миниатюры видео YouTube в ячейку UITableView с помощью следующего кода. Однако всякий раз, когда я прокручиваю таблицу, миниатюры видео перезагружаются, когда ячейка покидает экран и возвращается.

Каков наиболее эффективный способ кэширования миниатюр, чтобы они загружались только в первый раз?

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

1 Ответ

0 голосов
/ 07 ноября 2015

В этих ситуациях вы можете (после первого выделения webView) связать webView с объектом в searchResultArray с objc_setAssociatedObject.

Дело в том, что поскольку cellFoRowAtIndexPath вызывается каждый раз, когда ячейка становится видимой, вам не следует инициализировать веб-представление там, но когда вы инициализируете их, вы делаете:

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
}

Вы можете инициализировать веб-представления всякий раз, когда будете к этому готовы. & someKey является статическим символом и должен быть глобальным для класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...