2011-03-06 17 views
5

Actualmente tengo una vista de tabla con videos de YouTube integrados dentro de las celdas personalizadas.Videos de YouTube dentro de la aplicación UITableView iPhone

Lo hice porque de mi investigación parecía la única forma de permitir que los videos se cargaran sin salir de mi aplicación.

El problema es el siguiente:

Las miniaturas tomar un tiempo para cargar.

Al desplazarme por la lista de videos, sigue teniendo que cargar los thunbnails.

Si me desplazo hacia atrás ... intenta cargar las miniaturas de video una vez más.

¿Alguien ha recibido alguna sugerencia ya sea sobre mejores formas de hacerlo, o formas de obtener las celdas de la tabla para guardar los datos y no reemplazarlos?

Mi código es el siguiente:

CustomVideoCell *cell = (CustomVideoCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomVideoCell"]; 

if (cell == nil) { 

UIViewController *temporaryController = [[UIViewController alloc] initWithNibName:@"CustomVideoCell" bundle:nil]; 

cell = (CustomVideoCell *)temporaryController.view; 

[temporaryController release]; 


GDataEntryBase *entry = [[self.feed entries] objectAtIndex:indexPath.row]; 
NSString *title = [[entry title] stringValue]; 
NSString *videoID = [[(GDataEntryYouTubeVideo *)entry mediaGroup] videoID]; 


NSString *htmlString = 
[ 
[NSString alloc] 
initWithFormat:@"<html><head><meta name = \"viewport\" content = \"initial-scale = 2.0, user-scalable = no, width = 110\"/></head><body style=\"background:#000;margin-top:0px;margin-left:0px\"><div><object width=\"110\" height=\"90\"><param name=\"movie\" value=\"http://www.youtube.com/v/%@&f=gdata_videos&c=ytapi-my-clientID&d=nGF83uyVrg8eD4rfEkk22mDOl3qUImVMV6ramM\"></param><param name=\"wmode\" value=\"transparent\"></param><embed src=\"http://www.youtube.com/v/%@&f=gdata_videos&c=ytapi-my-clientID&d=nGF83uyVrg8eD4rfEkk22mDOl3qUImVMV6ramM\" type=\"application/x-shockwave-flash\" wmode=\"transparent\" width=\"110\" height=\"90\"></embed></object></div></body></html>", 
videoID, videoID 
]; 


[[[cell.web subviews] lastObject] setScrollEnabled:NO]; 
[cell.web loadHTMLString:htmlString baseURL:[NSURL URLWithString:@"http://www.website.com"]]; 

cell.title.text = title; 

Saludos

+0

¿Alguien sabe de algún buen hilo y/o tutorial porque quiero hacer algo como esto pero realmente no sé por dónde empezar? Lo siento, soy un novato – tallen11

Respuesta

3

Lo que hago en estos casos es crear una función que llene una matriz mutable con las celdas de la tabla que necesito.
Luego, en el método:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

Puedo devolver la celda de la matriz en base al índice de esta manera:

return [cellArray objectAtIndex:indexPath.row]; 

he creado matrices muy grandes mutables de esta manera y no tenía problemas de memoria, pero Supongo que depende de otras cosas en tu aplicación.

+0

Gracias amigo, este método funcionó muy bien y detiene el retraso en el desplazamiento también! – mattmate

+0

@zigglzworth celda de caché tomar algún tiempo. ¿Dónde lo implementas? viewDidLoad? – Katerina

0

No quitar de la cola y reutilizar las celdas de la tabla. Habrá un golpe de rendimiento porque está asignando nuevas células todo el tiempo, pero debería funcionar. Cuando reciba una advertencia de memoria, comience a liberar las celdas.

+0

Gracias, probé esto, sin embargo, como cada celda contiene una vista web, cuando salen de la pantalla, parecen descargar ... luego, cuando vuelven a la pantalla, vuelven a cargar ... lo que a su vez obliga a para volver a cargar la miniatura de Youtube – mattmate

+0

¿Ha considerado implementar la tabla con una gran UIWebView? – tomislav

1

Guarda en caché solo las vistas web, no toda la celda de la tabla. De esa forma, aún puedes reutilizar las celdas. que utilizan YouTubeView de aquí http://iosdevelopertips.com/video/display-youtube-videos-without-exiting-your-application.html

-(void) cacheYouTubeViews { 
NSArray * videos = [self.fetchedResultsController fetchedObjects]; 
self.myVideosCache = [[NSMutableArray alloc] initWithCapacity:[videos count]]; 

for (Video * video in videos) { 
    YouTubeView * youTubeView = [[YouTubeView alloc] 
           initWithStringAsURL: video.link 
           frame:CGRectMake(0, 0, 
                kVideoThumbnailSize, 
                kVideoThumbnailSize)]; 
    [self.myVideosCache addObject:youTubeView]; 


    } 


} 

Luego, en el método de cellForRowAtIndexPath reemplazar YouTubeView de la célula:

YouTubeView * youTubeView = [self.myVideosCache objectAtIndex:indexPath.row]; 
    [cell.contentView addSubview:youTubeView]; 

Asegúrese de retirar el viejo YouTubeView de la jerarquía vista secundaria de la célula.
Estoy encontrando pérdidas de memoria cuando la tabla se desplaza, posiblemente un problema general con el uso de UIWebView dentro de UITableView.

Cuestiones relacionadas